元素划分,无视零

时间:2014-12-09 14:24:26

标签: python numpy

这是一个蟒蛇问题:假设我有一个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

1 个答案:

答案 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。)