Ответ 1
После выполнения
bbins=np.bincount(b)
почему бы и нет:
a[:len(bbins)] += bbins
(Отредактировано для дальнейшего упрощения.)
У меня есть массив 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, чтобы решить эту проблему?
После выполнения
bbins=np.bincount(b)
почему бы и нет:
a[:len(bbins)] += bbins
(Отредактировано для дальнейшего упрощения.)
В 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])
Если 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
Почему бы и нет?
for i in b:
a[i] += 1