2017-02-18 3 views
4

これを行う方法は決して覚えていません。ディメンションを配列に追加するにはどうすればよいですか? (スクイズの反対)

は、どのように列の行列(サイズ(n1,1))へのベクトル(サイズ(n1))から

  • を行くことができますか?
  • または行列(サイズ(n1,n2))から配列{T、3}(サイズ(n1,n2,1))までですか?
  • または配列{T、3}(サイズ​​)から配列{T、4}(サイズ(n1,n2,n3, 1))までですか?
  • など。

Arrayを使用して、それを使用して余分なシングルトンの後続次元を持つ新しいArrayを定義することを知りたいと思います。 I. squeeze

+1

これが重複しているような気がします。しかし、私は決してこのことを思い出したり、既存のSO答えを見つけることはできません。 –

答えて

0

正確な形状に整形以外のもう1つの簡単な方法は、一緒にcatndimsを使用することです。これには、追加する追加(シングルトン)ディメンションの数を指定できるという利点があります。例えば

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 

など

+1

この解決策はきれいに見えますが、' reshape'メソッドはほとんど割り振られていない簡単なベンチマークで40倍高速です。 –

+1

ええ、それは理にかなっています。 reshapeは、最初のオブジェクトに "view"を返します(返される型に関しては目に見えません)。私は、新しい配列ではなくビューが意図された動作であれば、リシェイプベースのアプローチが望ましいことに同意します。 –

8

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 
+0

'widen'はこの操作のための混乱した名前です。なぜなら、それはすでに非常に異なる何かを意味するからです。 'widen(A)'のように、配列の各要素に適用されることを期待するコードを読んでいる人もいます。 – tholy

+0

@tholy、ok。 'add_dim'に変更されました。 100%満足しているわけではありません。名前の提案はありますか?私はTensorFlowが 'expand_dims(x、insert_at_ind)'を使っていますが、それには第2引数があります。単に後尾を使用するのではなく。 –

+0

別の名前の可能性: 'rpad(M、3)'は、右に長さ1の次元を追加することで配列Mを3次元配列にします(同様に左側に 'lpad')。それは文字列のメソッドをオーバーロードしますが、同様の動作のようなものです。 'Base.rpad(m :: AbstractArray、n :: Integer)= reshape(m、size(m)...、1 = i:n-ndims(m)]のように定義できます。 ) ' –

関連する問題