Векторизация операции индексирования в numpy

#python #indexing #numpy

#python #индексирование #numpy

Вопрос:

Каков наилучший способ векторизации следующего кода в 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
  

Результат должен быть:

 [0 4 0 1 0]
  

Здесь A находится исходный массив, I в котором хранится индекс, на который мы хотим увеличить соответствующую запись J .

Если просто векторизировать вышесказанное, выполнив:

 A[I]  = J
print A
  

один из них дает неправильный ответ

 [0 1 0 1 0]
  

поскольку, по-видимому, повторяющиеся индексы игнорируются. Существует ли эквивалентная операция = , которая не игнорирует повторяющиеся индексы?

Ответ №1:

Вы можете использовать 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)
  

С принтами

 [0 4 0 1 0]
  

Ответ №2:

В принципе, вы можете сделать это с помощью numpy ‘s bincount и unique , но я бы предположил, что это только сделает код намного менее читаемым без какого-либо ощутимого улучшения производительности.