python - 将多个值添加到一个 numpy 数组索引

标签 python arrays numpy

简单版: 如果我这样做:

import numpy as np
a = np.zeros(2)
a[[1, 1]] += np.array([1, 1])

我得到 [0, 1] 作为输出。但我想要 [0, 2]。这有可能以某种方式使用隐式 numpy 循环而不是自己循环吗?

我实际需要做什么版本:

我有一个包含索引、值和一些 bool 值的结构化数组。我想根据 bool 值对这些索引处的这些值求和。很明显,这可以通过一个简单的循环来完成,但它似乎应该可以通过巧妙的 numpy 索引(如上所述)来实现。

例如,我有一个包含 5 个元素的数组,我想从数组中填充值、索引和条件:

import numpy as np
size = 5
nvalues = 10
np.random.seed(1)
a = np.zeros(nvalues, dtype=[('val', float), ('ix', int), ('cond', bool)])
a = np.rec.array(a)
a.val = np.random.rand(nvalues)
a.cond = (np.random.rand(nvalues) > 0.3)
a.ix = np.random.randint(size, size=nvalues)

# obvious solution
obvssum = np.zeros(size)
for i in a:
    if i.cond:
        obvssum[i.ix] += i.val

# is something this possible?
doesntwork = np.zeros(size)
doesntwork[a[a.cond].ix] += a[a.cond].val

print(doesntwork)
print(obvssum)

输出:

[ 0.          0.          0.61927097  0.02592623  0.29965467]
[ 0.          0.          1.05459336  0.02592623  1.27063303]

我认为这里发生的事情是,如果 a[a.cond].ix 保证是唯一的,我的方法就可以正常工作,如简单示例中所述。

最佳答案

这就是at NumPy ufuncs 的方法用于:

output = numpy.zeros(size)
numpy.add.at(output, a[a.cond].ix, a[a.cond].val)

关于python - 将多个值添加到一个 numpy 数组索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41990028/

相关文章:

python 绘制特征向量

python - ValueError : Input contains NaN, 无穷大或值对于 dtype ('float64' 来说太大)使用来自 KNeighborsRegressor 的拟合

python - 使用 python 脚本发送电子邮件

arrays - 声明数组但不定义数组(Shell 脚本)

python - 使用 sqlalchemy 查询使用多列 where in 子句

php - 递归数组搜索

java - 如何添加com.google.gson.JsonArray 的特定索引?

python - numpy.extract 和 numpy.any 函数,是否可以使其更简单?

Python 加速 : reading data from mongodb slow

python - sqlalchemy 按 json 字段过滤