我永远不会记得如何做到这一点。
怎么去
(n1)
)到列矩阵(大小(n1,1)
)? (n1,n2)
)到数组{T,3}(大小(n1,n2,1)
)? (n1,n2,n3)
)到数组{T,4}(大小(n1,n2,n3, 1)
)? 我想知道使用Array并使用它来定义一个带有额外单例尾随维度的新数组。
即与squeeze
答案 0 :(得分:9)
您可以使用reshape
执行此操作。
您可以为此定义一种方法:
add_dim(x::Array) = reshape(x, (size(x)...,1))
julia> add_dim([3;4])
2×1 Array{Int64,2}:
3
4
julia> add_dim([3;4])
2×1 Array{Int64,2}:
3
4
julia> add_dim([3 30;4 40])
2×2×1 Array{Int64,3}:
[:, :, 1] =
3 30
4 40
julia> add_dim(rand(4,3,2))
4×3×2×1 Array{Float64,4}:
[:, :, 1, 1] =
0.483307 0.826342 0.570934
0.134225 0.596728 0.332433
0.597895 0.298937 0.897801
0.926638 0.0872589 0.454238
[:, :, 2, 1] =
0.531954 0.239571 0.381628
0.589884 0.666565 0.676586
0.842381 0.474274 0.366049
0.409838 0.567561 0.509187
答案 1 :(得分:3)
在Julia 1.0发布之前的某个时间,添加了reshape(x, Val{N})
重载,对于N > ndim(x)
,这导致了最右边的单例尺寸的添加。
因此,以下工作有效:
julia> add_dim(x::Array{T, N}) where {T,N} = reshape(x, Val(N+1))
add_dim (generic function with 1 method)
julia> add_dim([3;4])
2×1 Array{Int64,2}:
3
4
julia> add_dim([3 30;4 40])
2×2×1 Array{Int64,3}:
[:, :, 1] =
3 30
4 40
julia> add_dim(rand(4,3,2))
4×3×2×1 Array{Float64,4}:
[:, :, 1, 1] =
0.0737563 0.224937 0.6996
0.523615 0.181508 0.903252
0.224004 0.583018 0.400629
0.882174 0.30746 0.176758
[:, :, 2, 1] =
0.694545 0.164272 0.537413
0.221654 0.202876 0.219014
0.418148 0.0637024 0.951688
0.254818 0.624516 0.935076
答案 2 :(得分:1)
除了重塑为精确形状之外,另一种简单方法是同时使用cat
和ndims
。这有一个额外的好处,你可以指定“你想添加多少额外(单个)尺寸”。 e.g。
a = [1 2 3; 2 3 4];
cat(ndims(a) + 0, a) # add zero singleton dimensions (i.e. stays the same)
cat(ndims(a) + 1, a) # add one singleton dimension
cat(ndims(a) + 2, a) # add two singleton dimensions
等