如何向数组添加维度? (与`挤压'相反)

时间:2017-02-18 07:17:12

标签: julia

我永远不会记得如何做到这一点。

怎么去

  • 从Vector(大小(n1))到列矩阵(大小(n1,1))?
  • 或从Matrix(大小(n1,n2))到数组{T,3}(大小(n1,n2,1))?
  • 或从数组{T,3}(大小(n1,n2,n3))到数组{T,4}(大小(n1,n2,n3, 1))?
  • 等等。

我想知道使用Array并使用它来定义一个带有额外单例尾随维度的新数组。 即与squeeze

相反

3 个答案:

答案 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)

除了重塑为精确形状之外,另一种简单方法是同时使用catndims。这有一个额外的好处,你可以指定“你想添加多少额外(单个)尺寸”。 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