简体   繁体   中英

Vectorizing an indexing operation in numpy

What is the best way to vectorize the following code in numpy?

from numpy import *

A = zeros(5, dtype='int')
I = [1, 1, 1, 3]
J = [2, 1, 1, 1]
for i, j in zip(I, J):
    A[i] += j

print A

The result should be:

[0 4 0 1 0]

Here A is the original array, I stores the index at which we want to increment by the corresponding entry of J .

If one simply vectorizes the above by doing:

A[I] += J
print A

one gets the wrong answer

[0 1 0 1 0]

as, apparently, repeated indices are ignored. Is there an equivalent operation to += which does not ignore repeated indices?

You can use numpy.bincount() :

A = numpy.zeros(5, dtype='int')
I = [1, 1, 1, 3]
J = [2, 1, 1, 1]
sums = numpy.bincount(I, J)
A[:len(sums)] += sums
print(A)

prints

[0 4 0 1 0]

原则上你可以用numpybincountunique来做到这一点,但是我猜它只会使代码的可读性降低,而不会有任何合理的性能提升。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM