给定一个数组如下:
A = Array{Array{Int}}(2,2)
A[1,1] = [1,2]
A[1,2] = [3,4]
A[2,1] = [5,6]
A[2,2] = [7,8]
然后,A
是一个2x2数组,其元素类型为Array{Int}
:
2×2 Array{Array{Int64,N} where N,2}:
[1, 2] [3, 4]
[5, 6] [7, 8]
可以通过以下方式访问条目: A[1,2]
但A[1,2,2]
不起作用,因为A中不存在第三个维度。但是,A[1,2][2]
有效,因为A[1,2]
返回长度为2的数组。
问题是,将A
转换为三维数组B
的好方法是什么,以便B[i,j,k]
引用第i,第j个数组和该数组中的第k个元素。例如。 B[2,1,2] = 6
。
有一种直接的方法可以使用3个嵌套循环并逐个元素地重建数组,但我希望有一个更好的结构。 (或许cat
的一些应用?)
答案 0 :(得分:2)
您可以使用数组解析
从A构造一个三维数组julia> B = [ A[i,j][k] for i=1:2, j=:1:2, k=1:2 ]
2×2×2 Array{Int64,3}:
[:, :, 1] =
1 3
5 7
[:, :, 2] =
2 4
6 8
julia> B[2,1,2]
6
然而,更通用的解决方案是为具有相同类型A的数组重载getindex函数。由于不需要复制原始数据,因此效率更高。
julia> import Base.getindex
julia> getindex(A::Array{Array{Int}}, i::Int, j::Int, k::Int) = A[i,j][k]
getindex (generic function with 179 methods)
julia> A[2,1,2]
6
答案 1 :(得分:0)
感谢Dan Getz的评论,我认为以下作品和非常简洁:
cat(3,(getindex.(A,i) for i=1:2)...)
其中2
是嵌套数组的长度。它也适用于更高的尺寸。
答案 2 :(得分:0)
permutedims(reshape(collect(Base.Iterators.flatten(A)), (2,2,2)), (2,3,1))
也可以完成这项工作,并且似乎比我接受的cat()
答案要快。