我有一个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操作来解决这个问题吗?
答案 0 :(得分:16)
在numpy> = 1.8中,您还可以使用添加'universal function'('ufunc')的at
方法。正如docs note:
对于add ufunc,此方法等同于[indices] + = 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])
答案 1 :(得分:5)
完成后
bbins=np.bincount(b)
为什么不这样做:
a[:len(bbins)] += bbins
(编辑进一步简化。)
答案 2 :(得分:1)
如果b
是a
的一个小子范围,可以像这样改进Alok的答案:
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
答案 3 :(得分:-3)
为什么不呢?
for i in b:
a[i] += 1