2011-08-21 38 views
15

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

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.]) 

答えて

23

あなたが与えてくれた具体的な例:あなたは、NPを使用することができます(m)に(L、M、N)の配列を分割するあなたは、他の軸を使用する場合は

あなたはすべてをトランスポーズでき.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 

ブロードキャストルールhereについては、すべて読むことができます。必要に応じて、新生児喘息を複数回使用することもできます。 (例えば、形状(3,4,5,6)アレイを形状(3,5)アレイで分割する)。

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

インデックス作成、newaxisなどについては、より詳しくはhereをご覧ください。 (この回答が最初に掲載されて以来、文書が再編成されました)。

0

私はあなたが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.]) 
+0

いいえ、あなたはありません。その方法は、例として与えられた2次元配列では失敗します。私があなたに与えた例は、c = a/np.apply_along_axis(np.linalg.norm、1、a)[:, np.newaxis]を行うことができますが、関数のようなもっと一般的なものを探していますdivide_along_axis()私は質問で定義します。 – user545424

+1

転置についてはどうなりますか(編集された回答を参照)?あるいは、最初に転置、分割、転置して 'divide_along_axis'を定義することもできます。 – Owen

+1

新しい軸を1次元配列に追加するだけです。 – tillsten