29

軸に沿って配列を別の配列の要素で分割するnumpy関数はありますか? たとえば、形状 (l,m,n) の配列aと形状 (m,)の配列bがあるとします。私は次のものに相当するものを探しています:

def divide_along_axis(a,b,axis=None):
    if axis is None:
        return a/b
    c = a.copy()
    for i, x in enumerate(c.swapaxes(0,axis)):
        x /= b[i]
    return c

たとえば、これはベクトルの配列を正規化するときに役立ちます。

>>> a = np.random.randn(4,3)
array([[ 1.03116167, -0.60862215, -0.29191449],
       [-1.27040355,  1.9943905 ,  1.13515384],
       [-0.47916874,  0.05495749, -0.58450632],
       [ 2.08792161, -1.35591814, -0.9900364 ]])
>>> np.apply_along_axis(np.linalg.norm,1,a)
array([ 1.23244853,  2.62299312,  0.75780647,  2.67919815])
>>> c = divide_along_axis(a,np.apply_along_axis(np.linalg.norm,1,a),0)
>>> np.apply_along_axis(np.linalg.norm,1,c)
array([ 1.,  1.,  1.,  1.])
4

2 に答える 2

39

あなたが与えた特定の例について:(l、m、n)配列を(m、)で割ると、np.newaxisを使用できます:

a = np.arange(1,61, dtype=float).reshape((3,4,5)) # Create a 3d array 
a.shape                                           # (3,4,5)

b = np.array([1.0, 2.0, 3.0, 4.0])                # Create a 1-d array
b.shape                                           # (4,)

a / b                                             # Gives a ValueError

a / b[:, np.newaxis]                              # The result you want 

放送規則については、こちらですべて読むことができます。必要に応じて、newaxis を複数回使用することもできます。(たとえば、形状 (3,4,5,6) 配列を形状 (3,5) 配列で分割する場合)。

私のドキュメントの理解から、newaxis +ブロードキャストを使用すると、不要な配列のコピーも回避されます。

インデックス作成、newaxis などについては、ここで詳しく説明します。(この回答が最初に投稿されてからドキュメントが再編成されました)。

于 2011-08-22T14:35:24.713 に答える
2

numpy の通常のブロードキャスト動作でこの動作を取得できると思います。

In [9]: a = np.array([[1., 2.], [3., 4.]])

In [10]: a / np.sum(a, axis=0)
Out[10]:
array([[ 0.25      ,  0.33333333],
       [ 0.75      ,  0.66666667]])

私が正しく解釈した場合。

他の軸が必要な場合は、すべてを転置できます。

> a = np.random.randn(4,3).transpose()
> norms = np.apply_along_axis(np.linalg.norm,0,a)
> c = a / norms
> np.apply_along_axis(np.linalg.norm,0,c)
array([ 1.,  1.,  1.,  1.])
于 2011-08-21T22:11:17.730 に答える