Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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
Arrays 在Julia中,将3D数组转换为2D数组的最有效方法是什么?_Arrays_Julia - Fatal编程技术网

Arrays 在Julia中,将3D数组转换为2D数组的最有效方法是什么?

Arrays 在Julia中,将3D数组转换为2D数组的最有效方法是什么?,arrays,julia,Arrays,Julia,主题说明了一切 我只是想这样做,但对我来说,分配新阵列效率很低 julia> a = reshape(1:30, 2, 3, 5) 进入 是否有一种简单的方法可以将类型从Array{T,3}转换为Array{T,2},1}?您可以使用SplitApplyCombine.jl,并且有一个函数splitdimsview,它完全满足您的要求: julia> a = reshape(1:30, 2, 3, 5); julia> b = splitdimsview(a, 3) 5-e

主题说明了一切

我只是想这样做,但对我来说,分配新阵列效率很低

julia> a = reshape(1:30, 2, 3, 5)
进入


是否有一种简单的方法可以将类型从
Array{T,3}
转换为
Array{T,2},1}

您可以使用SplitApplyCombine.jl,并且有一个函数
splitdimsview
,它完全满足您的要求:

julia> a = reshape(1:30, 2, 3, 5);

julia> b = splitdimsview(a, 3)
5-element SplitDimsArray{SubArray{Int64,2,Base.ReshapedArray{Int64,3,UnitRange{Int64},Tuple{}},Tuple{Base.Slice{Base.OneTo{Int64}},Base.Slice{Base.OneTo{Int64}},Int64},true},1,(3,),Base.ReshapedArray{Int64,3,UnitRange{Int64},Tuple{}}}:
 [1 3 5; 2 4 6]
 [7 9 11; 8 10 12]
 [13 15 17; 14 16 18]
 [19 21 23; 20 22 24]
 [25 27 29; 26 28 30]

请注意,该对象不是
向量{Matrix}
,而是一个自定义对象(但除了它是一个视图外,具有相同的特征)。

如果不进行分配,这是不可能的。但是,您可以使用视图而不是实际创建数组,例如

julia> a = reshape(1:30, 2, 3, 5);

julia> collect(eachslice(a, dims=3))
5-element Array{SubArray{Int64,2,Base.ReshapedArray{Int64,3,UnitRange{Int64},Tuple{}},Tuple{Base.Slice{Base.OneTo{Int64}},Base.Slice{Base.OneTo{Int64}},Int64},true},1}:
 [1 3 5; 2 4 6]
 [7 9 11; 8 10 12]
 [13 15 17; 14 16 18]
 [19 21 23; 20 22 24]
 [25 27 29; 26 28 30]

SplitDimsArray
type from SplitApplyCombine.jl基本上在两个级别(内部数组和外部数组)上创建一个视图,因此它仍然会进行分配,但与内部或外部容器的大小无关(仅与创建“包装器”对象所需的大小相同)。另外,如果不需要
getindex
,并且能够迭代就足够了,那么对于Jongsu来说,
eachslice(a,dims=3)
就足够了?实际上,我需要它是因为zyote.jl和Flux.jl。我使用CNN和RNN,然后我需要转换以将CNN的输出传递给RNN。这两个答案都是正确的,但对我来说,这个答案更合适,因为合子可以得到伴随。这就是我改变答案的原因。无论如何,谢谢你的回答,@BogumiłKamiński!
julia> a = reshape(1:30, 2, 3, 5);

julia> collect(eachslice(a, dims=3))
5-element Array{SubArray{Int64,2,Base.ReshapedArray{Int64,3,UnitRange{Int64},Tuple{}},Tuple{Base.Slice{Base.OneTo{Int64}},Base.Slice{Base.OneTo{Int64}},Int64},true},1}:
 [1 3 5; 2 4 6]
 [7 9 11; 8 10 12]
 [13 15 17; 14 16 18]
 [19 21 23; 20 22 24]
 [25 27 29; 26 28 30]