我有一个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]]]])
答案 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])