Преобразование массива CartesianIndex в 2D-матрицу в Julia - PullRequest
0 голосов
/ 18 января 2019

скажем, у нас есть массив декартовых индексов в Юлии

julia> typeof(indx)
Array{CartesianIndex{2},1}

Теперь мы хотим построить их как точечную диаграмму, используя PyPlot. поэтому мы должны преобразовать indx -Artes of Cartesian в 2D-матрицу, чтобы мы могли построить ее так:

PyPlot.scatter(indx[:, 1], indx[:, 2])

Как мне преобразовать массив типа Array {CartesianIndex {2}, 1} в 2D-матрицу типа Array {Int, 2}

Кстати, вот фрагмент кода, как создать фиктивный массив cartesianindex:

A = rand(1:10, 5, 5)
indx = findall(a -> a .> 5, A) 
typeof(indx) # this is an Array{CartesianIndex{2},1}

Спасибо

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Простой и универсальный способ это

julia> as_ints(a::AbstractArray{CartesianIndex{L}}) where L = reshape(reinterpret(Int, a), (L, size(a)...))
as_ints (generic function with 1 method)

julia> as_ints(indx)
2×9 reshape(reinterpret(Int64, ::Array{CartesianIndex{2},1}), 2, 9) with eltype Int64:
 1  3  4  1  2  4  1  1  4
 2  2  2  3  3  3  4  5  5

Это работает для любой размерности, делая первое измерение индексом в CartesianIndex.

0 голосов
/ 18 января 2019

Один из возможных способов: hcat(getindex.(indx, 1), getindex.(indx,2))

julia> @btime hcat(getindex.($indx, 1), getindex.($indx,2))
  167.372 ns (6 allocations: 656 bytes)
10×2 Array{Int64,2}:
 4  1
 3  2
 4  2
 1  3
 4  3
 5  3
 2  4
 5  4
 1  5
 4  5

Однако обратите внимание, что вам не нужно - и, следовательно, вероятно, не нужно - приводить ваши индексы в форму 2D-матрицы. Вы могли бы просто сделать

PyPlot.scatter(getindex.(indx, 1), getindex.(indx, 2))
...