在Julia

时间:2019-01-18 14:57:59

标签: arrays julia

假设我们在Julia中有一系列笛卡尔索引

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

现在,我们想使用PyPlot将它们绘制为散点图。因此我们应该将笛卡尔的 indx 数组转换为2D矩阵,以便可以像这样绘制它:

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

如何将类型为 Array {CartesianIndex {2},1} 的数组转换为类型为 Array {Int,2}

的2D矩阵>

顺便说一下,这是一个代码片段,如何生成笛卡尔索引的虚拟数组:

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

谢谢

2 个答案:

答案 0 :(得分:3)

一种简单而通用的方法是

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

这适用于任何维度,使第一个维度成为笛卡尔索引的索引。

答案 1 :(得分:2)

一种可能的方法是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))