37

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正常に動作しますが、間違った次元に沿って連結されます。

4

6 に答える 6

40

簡単な答え: できません。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 を使用して、一部のインデックスが一部の行で無効であることを通知するために、一般abな長さに強制することです。たとえば、マスクされた配列としては次のとおりです。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興味深い場合もあります。)

于 2013-02-16T23:48:15.813 に答える
0

このタイプの配列を効率的に処理するための新しいライブラリがあります: https://github.com/scikit-hep/awkward-array

于 2019-10-29T19:40:06.917 に答える