假设我们在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}
谢谢
答案 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))