Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Julia 将嵌套数组转换为新维度_Julia - Fatal编程技术网

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)…