2017-03-17 6 views
2

私は5次元の配列(ビニング操作から来て)を持っています。はノーマル(最後の次元は合計== 1)です。Numpyはマルチディム(> = 3)の配列を正規化します。

私は答えhereを見つけたと思ったが、それは言う:私のような5つのネストされたループ、との結果を達成 ValueError: Found array with dim 5. the normalize function expected <= 2.

for en in range(en_bin.nb): 
    for zd in range(zd_bin.nb): 
     for az in range(az_bin.nb): 
      for oa in range(oa_bin.nb): 
       # reduce fifth dimension (en reco) for normalization 
       b = np.sum(a[en][zd][az][oa]) 
       for er in range(er_bin.nb): 
        a[en][zd][az][oa][er] /= b 

が、私は操作をvectoriseたいです。例えば

In [18]: a.shape 
Out[18]: (3, 1, 1, 2, 4) 
In [20]: b.shape 
Out[20]: (3, 1, 1, 2) 

In [22]: a 
Out[22]: 
array([[[[[ 0.90290316, 0.00953237, 0.57925688, 0.65402645], 
     [ 0.68826638, 0.04982717, 0.30458093, 0.0025204 ]]]], 



    [[[[ 0.7973917 , 0.93050739, 0.79963614, 0.75142376], 
     [ 0.50401287, 0.81916812, 0.23491561, 0.77206141]]]], 



    [[[[ 0.44507296, 0.06625994, 0.6196917 , 0.6808444 ], 
     [ 0.8199077 , 0.02179789, 0.24627425, 0.43382448]]]]]) 

In [23]: b 
Out[23]: 
array([[[[ 2.14571886, 1.04519487]]], 


    [[[ 3.27895899, 2.33015801]]], 


    [[[ 1.81186899, 1.52180432]]]]) 

答えて

3

次いでnumpy.sumaxis=-1をリストすることによって、最後の軸に沿って、合計、寸法を維持し、単に、アレイ自体で割る従ってNumPy broadcastingにもたらす - これは

a/a.sum(axis=-1,keepdims=True) 

べき一般的な次元数のndarrayに適用できます。

代わりに、我々は、次に、軸還元とを有するsumが入力アレイ形状と一致した後、分割するNone/np.newaxisと新しい軸を追加することができ -

a/(a.sum(axis=-1)[...,None]) 
+1

1 'のようになりtrue'を代わり 'の'渡しますより明確に – Eric

+0

@Divakarと今は恋に落ちています。 – bio

+0

あなたは[回答](http://stackoverflow.com/questions/42859325/swap-zeros-in-numpy-matrix)を削除したのはなぜですか? – EdChum

関連する問題