【问题标题】:Numpy normalize multi dim (>=3) arrayNumpy标准化多暗淡(> = 3)数组
【发布时间】:2017-08-08 21:42:19
【问题描述】:

我有一个 5 个暗淡的数组(来自分箱操作)并希望对其进行规范(最后一维的总和 == 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]]]])

【问题讨论】:

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


    【解决方案1】:

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

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

    这应该适用于一般维数的 ndarray。

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

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

    【讨论】:

    • 你为什么要删除你的 answer 它看起来不错,我会 +1
    猜你喜欢
    • 2020-12-29
    • 2022-01-16
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 2018-10-18
    • 2019-06-01
    相关资源
    最近更新 更多