2017-03-17 16 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