2017-03-17 14 views
2

我有一個5個暗淡的數組(來自分箱操作),並希望規範(sum == 1爲最後一個維度)。Numpy normalize multi dim(> = 3)數組

我想我找到了答案here但它說: ValueError: Found array with dim 5. the normalize function expected <= 2.

我實現了與5個嵌套循環,像結果:

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

沿最後軸薩姆通過列出axis=-1numpy.sum,保持尺寸,然後簡單地由陣列本身分裂,從而使在NumPy broadcasting -

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

這應該適用於通用維度的標準。

可替代地,我們可以用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)它看起來很好,我會+1它 – EdChum