Numpy 规范化多维 (>=3) 数组
Numpy normalize multi dim (>=3) array
我有一个 5 dim 数组(来自合并操作)并且想要它 normed(最后一个维度的总和 == 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]]]])
通过列出 axis=-1
和 numpy.sum
, keeping dimensions and then simply divide by the array itself, thus bringing in NumPy broadcasting
-
沿最后一个轴求和
a/a.sum(axis=-1,keepdims=True)
这应该适用于通用维数的 ndarrays。
或者,我们可以 sum
使用轴缩减,然后使用 None/np.newaxis
添加一个新轴以匹配输入数组形状,然后除以 -
a/(a.sum(axis=-1)[...,None])
我有一个 5 dim 数组(来自合并操作)并且想要它 normed(最后一个维度的总和 == 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]]]])
通过列出 axis=-1
和 numpy.sum
, keeping dimensions and then simply divide by the array itself, thus bringing in NumPy broadcasting
-
a/a.sum(axis=-1,keepdims=True)
这应该适用于通用维数的 ndarrays。
或者,我们可以 sum
使用轴缩减,然后使用 None/np.newaxis
添加一个新轴以匹配输入数组形状,然后除以 -
a/(a.sum(axis=-1)[...,None])