根据另一个数组中的索引求和numpy数组的值

3
假设我有以下数组:
N = 8
M = 4

a = np.zeros(M)
b = np.random.randint(M, size=N) # contains indices for a
c = np.random.rand(N) # contains random values

我希望按照b中提供的索引值对c的值求和,并将它们存储在a中。编写循环实现这一点是微不足道的:
for i, v in enumerate(b):
    a[v] += c[i]

由于在我的实际问题中,N 可能相当大,因此我希望避免使用 Python 循环,但我无法想出如何将其编写为 numpy 语句。有人可以帮我吗?

好的,这里是一些示例值:

In [27]: b
Out[27]: array([0, 1, 2, 0, 2, 3, 1, 1])

In [28]: c
Out[28]: 
array([ 0.15517108,  0.84717734,  0.86019899,  0.62413489,  0.24357903,
        0.86015187,  0.85813481,  0.7071174 ])

In [30]: a
Out[30]: array([ 0.77930596,  2.41242955,  1.10377802,  0.86015187])
1个回答

3
import numpy as np

N = 8
M = 4
b = np.array([0, 1, 2, 0, 2, 3, 1, 1])
c = np.array([ 0.15517108,  0.84717734,  0.86019899,  0.62413489,  0.24357903, 0.86015187,  0.85813481,  0.7071174 ])

a = ((np.mgrid[:M,:N] == b)[0] * c).sum(axis=1)

返回值

array([ 0.77930597,  2.41242955,  1.10377802,  0.86015187])

1
这是一个不错的答案,但对于我的目的来说需要相对较高的内存要求(7,000,000 x 30,000)。如果有人知道一种更少占用内存的方法,我很想知道。目前,对于高内存需求,一个简单的循环似乎是答案。 - Brian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接