5

観察:

In [1]: import numpy as np
In [2]: x = np.array([1, 2, 3])
In [3]: np.vstack([x, x])
Out[3]: 
array([[1, 2, 3],
       [1, 2, 3]])

In [4]: np.vstack(np.broadcast(x, x))
Out[4]: 
array([[1, 1],
       [2, 2],
       [3, 3]])

同様に forcolumn_stackrow_stack(hstackこの場合は動作が異なりますが、ブロードキャストで使用する場合も異なります)。なんで?

私は、この動作を「修復」する方法を見つけるのではなく、その背後にあるロジックを求めています (私はそれで問題ありませんが、直感的ではありません)。

4

1 に答える 1

5

np.broadcast配列を一緒にブロードキャストする方法を記述する iterator オブジェクトのインスタンスを返します。1特に、結果の配列が持つ形状と次元数を記述します。

重要なのは、Python でこのオブジェクトを実際に反復処理すると、各入力配列から要素のタプルが返されることです。

>>> b = np.broadcast(x, x)
>>> b.shape
(3,)
>>> b.ndim
1
>>> list(b)
[(1, 1), (2, 2), (3, 3)]

これは、配列に対して実際の操作を実行した場合 (たとえばx+x)、NumPy が shape (3,)、1 次元の配列を返し、タプル内の要素を結合して最終的な配列内の値を生成することを示しています (たとえば1+1、 、2+23+3追加のため)。

のソースを掘り下げると、与えられた iterable の要素が少なくとも 2 次元であることを確認し、それらを軸 0 に沿って積み重ねるだけであることvstackがわかります。

この場合b = np.broadcast(x, x)、次の配列をスタックすることを意味します。

>>> [np.atleast_2d(_m) for _m in b]
[array([[1, 1]]), array([[2, 2]]), array([[3, 3]])]

次に、これら 3 つの小さな配列が垂直方向に積み重ねられ、メモした出力が生成されます。


1さまざまな次元の配列がどのように並列に繰り返されるかは、NumPy のブロードキャスト動作のまさに中心です。コードは主にiterators.cにあります。Travis Oliphant 自身が書いた NumPy の多次元反復子の興味深い概要は、Beautiful Code book に記載されています。

于 2016-03-27T22:41:32.533 に答える