Julia 将嵌套数组转换为新维度
给定一个数组,如下所示:Julia 将嵌套数组转换为新维度,julia,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 = 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
的一些应用?您可以使用数组编辑器从
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
多亏了Dan Getz的评论,我认为以下内容非常有效且简洁:
cat(3,(getindex.(A,i) for i=1:2)...)
其中2
是嵌套数组的长度。它也适用于更高的维度。置换ims(重塑(收集(Base.Iterators.flatten(A)),(2,2,2)),(2,3,1))
也能完成这项工作,似乎比我接受的cat()
答案更快
编辑:很抱歉,我刚才看到评论中已经提出了这一点。
cat(3,first.(A),last.(A))
也给出了相同的矩阵。如果内部向量中有两个以上的元素,getindex
可以用来概括这种结构。我想出了一种方法:B=permutedims(重塑(收集(迭代器.展平(A)),(2,2,2)),[3,2,1])
,但它的可读性非常差,我宁愿使用下面@durand答案中的生成器。概括你的答案:cat(3,map(idx->getindex.(A,idx),(1:2))…
可能没问题(适用于合适的范围)。你的评论中的表达式也可以写:置换ims(重塑(vcat(A.)、2,2,2),[2,3,1])
和cat(3,(getindex.(A,i)适用于i=1:2)…