x が任意の数でn
ある形状の列方向のベクトルをスタックするにはどうすればよいですか?(x,)
例えば、
from numpy import *
a = ones((3,))
b = ones((2,))
c = vstack((a,b)) # <-- gives an error
c = vstack((a[:,newaxis],b[:,newaxis])) #<-- also gives an error
hstack
正常に動作しますが、間違った次元に沿って連結されます。
簡単な答え: できません。NumPy は、ジャグ配列をネイティブにサポートしていません。
長い答え:
>>> a = ones((3,))
>>> b = ones((2,))
>>> c = array([a, b])
>>> c
array([[ 1. 1. 1.], [ 1. 1.]], dtype=object)
は、期待どおりに動作する場合とそうでない場合がある配列を返します。たとえば、sum
またはreshape
のような基本的なメソッドはサポートされていません。これは、通常の Python リストを扱うのと同じように扱う必要があります[a, b]
(ベクトル化されたイディオムを使用する代わりに、操作を実行するために反復処理を行います)。
考えられる回避策がいくつかあります。最も簡単な方法は、マスクされた配列または NaN を使用して、一部のインデックスが一部の行で無効であることを通知するために、一般a
的b
な長さに強制することです。たとえば、マスクされた配列としては次のとおりです。b
>>> ma.array(np.resize(b, a.shape[0]), mask=[False, False, True])
masked_array(data = [1.0 1.0 --],
mask = [False False True],
fill_value = 1e+20)
a
これは、次のように積み重ねることができます。
>>> ma.vstack([a, ma.array(np.resize(b, a.shape[0]), mask=[False, False, True])])
masked_array(data =
[[1.0 1.0 1.0]
[1.0 1.0 --]],
mask =
[[False False False]
[False False True]],
fill_value = 1e+20)
(目的によっては、scipy.sparse
興味深い場合もあります。)
このタイプの配列を効率的に処理するための新しいライブラリがあります: https://github.com/scikit-hep/awkward-array