将嵌套数组转换为新维度

时间:2017-11-09 21:59:44

标签: julia

给定一个数组如下:

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的一些应用?)

3 个答案:

答案 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()答案要快。

编辑:对不起,我刚看到评论中已经提到过这个问题。