Numpy规范化多暗(> = 3)数组

时间:2017-03-17 10:58:06

标签: python python-3.x numpy numpy-broadcasting

我有一个5 dim数组(来自分箱操作),并且想要标准(最后一个维度的总和== 1)。

我以为我找到了答案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

但我想进行矢量化操作。

例如:

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

1 个答案:

答案 0 :(得分:3)

使用numpy.sum列出axis=-1,保持维度,然后简单地除以数组本身,从最后一个轴求和,从而引入NumPy broadcasting -

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

这适用于通用维数的ndarray。

或者,我们可以sum使用轴缩减,然后添加一个带有None/np.newaxis的新轴以匹配输入数组形状,然后除以 -

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