Каков наиболее эффективный способ преобразования трехмерного массива в массив двумерных массивов в Julia? - PullRequest
3 голосов
/ 27 апреля 2020

Субъект все говорит.

Я просто хочу сделать это, но для меня выделение нового массива неэффективно.

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

в

julia> b = [a[:, :, i] for i in 1:5]

Существует ли простой способ преобразования типа из Array{T, 3} в Array{Array{T, 2}, 1}?

Ответы [ 2 ]

4 голосов
/ 27 апреля 2020

Невозможно обойтись без выделения. Однако вы можете использовать представления вместо фактического создания массива, например, выполнив

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]
4 голосов
/ 27 апреля 2020

Вы можете использовать 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]

Обратите внимание, что объект не Vector{Matrix}, а пользовательский объект (но с теми же характеристиками, кроме вида).

...