这是一个蟒蛇问题:假设我有一个m+1
- 维度numpy数组a
由非负数组成,我想得到一个相同的数组b
最后一个坐标被归一化的大小,以便它们总和为1,或者如果它们全部为零则为零。例如,如果m = 2
,我的代码如下
import numpy as np
a = np.array([[[ 0.34 , 0.66],
[ 0.75 , 0.25]],
[[ 0. , 0. ],
[ 1. , 0. ]]])
for i1 in range(len(a)):
for i2 in range(len(a)):
s = a[i1][i2].sum()
if s > 0:
a[i1][i2] = a[i1][i2]/s
然而,我发现这种方法很草率。此外,它仅适用于固定m
。
答案 0 :(得分:3)
这可以通过广播来完成。有几种方法可以考虑零和异常。如果不考虑它,你可以写
import numpy as np
shape = (2, 3, 4)
X = np.random.randn(*shape) ** 2
sums = X.sum(-1)
Y = X / sums[..., np.newaxis]
现在,为了考虑某些行的潜在零和,我们将一行数据设置为0:
X[0, 0, :] = 0
sums = X.sum(-1)
nnz = sums != 0
Y = np.zeros_like(X)
Y[nnz, :] = X[nnz, :] / sums[nnz, np.newaxis]
您将观察到Y.sum(axis=-1)
在坐标(0,0)中的条目0反映了相应行的零点。
编辑:应用于具体示例
X = np.array(array([[[ 0.34 , 0.66],
[ 0.75 , 0.25]],
[[ 0. , 0. ],
[ 1. , 0. ]]]))
sums = X.sum(-1)
nnz = sums != 0
Y = np.zeros_like(X)
Y[nnz, :] = X[nnz, :] / sums[nnz, np.newaxis]
产生Y == X
(因为沿着最后一个轴,总和已经是1或0。)