Массив массива Increment с повторяющимися индексами

У меня есть массив Numpy и список индексов, значения которых я хотел бы увеличить на единицу. Этот список может содержать повторяющиеся индексы, и я бы хотел, чтобы приращение масштабировалось с количеством повторений каждого индекса. Без повторений команда проста:

a=np.zeros(6).astype('int')
b=[3,2,5]
a[b]+=1

С повторениями я придумал следующий метод.

b=[3,2,5,2]                     # indices to increment by one each replicate
bbins=np.bincount(b)
b.sort()                        # sort b because bincount is sorted
incr=bbins[np.nonzero(bbins)]   # create increment array
bu=np.unique(b)                 # sorted, unique indices (len(bu)=len(incr))
a[bu]+=incr

Это лучший способ? Есть ли риск, связанный с тем, что операции np.bincount и np.unique приведут к тому же упорядоченному порядку? Я пропустил простую операцию Numpy, чтобы решить эту проблему?

Ответ 1

После выполнения

bbins=np.bincount(b)

почему бы и нет:

a[:len(bbins)] += bbins

(Отредактировано для дальнейшего упрощения.)

Ответ 2

В numpy >= 1.8 вы также можете использовать метод at универсальной функции добавления ('ufunc'). Как примечание :

Для добавления ufunc этот метод эквивалентен [индексам] + = b, за исключением того, что результаты накапливаются для элементов, которые индексируются более одного раза.

Итак, возьмем ваш пример:

a = np.zeros(6).astype('int')
b = [3, 2, 5, 2]

... затем...

np.add.at(a, b, 1)

... оставит a как...

array([0, 0, 2, 1, 0, 1])

Ответ 3

Если b - небольшой поддиапазон a, можно уточнить ответ Алок следующим образом:

import numpy as np
a = np.zeros( 100000, int )
b = np.array( [99999, 99997, 99999] )

blo, bhi = b.min(), b.max()
bbins = np.bincount( b - blo )
a[blo:bhi+1] += bbins

print a[blo:bhi+1]  # 1 0 2

Ответ 4

Почему бы и нет?

for i in b:
    a[i] += 1