Python 具有重复索引的增量Numpy数组

Python 具有重复索引的增量Numpy数组,python,indexing,numpy,Python,Indexing,Numpy,我有一个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()

我有一个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操作来解决这个问题吗?

为什么不

for i in b:
    a[i] += 1
等你做完了

bbins=np.bincount(b)
为什么不:

a[:len(bbins)] += bbins

(为进一步简化而编辑。)

如果
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

在numpy>=1.8中,还可以使用添加“通用函数”(“ufunc”)的
at
方法。作为:

对于添加的ufunc,此方法相当于a[索引]+=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])

请注意,numpy.zeros(6).astype('int')最好写为numpy.zeros(6,int)。当b只包含几个大的bin数时,这不会更慢吗?是的,在这种情况下,它会比简单的Python循环慢,但仍然比OP的代码快。我用
b=[99999799999]
a=np.zero(1000,'int')
做了一个快速计时测试。计时是:OP:2.5毫秒,我的:495秒,简单循环:84秒。这很有效。在我的程序中,一个简单的循环通常比较慢。谢谢。在多维情况下,有没有类似的方法来实现这一点?这是目前最优雅的解决方案!我试图用一个矩阵来实现这一点,但我得到了一个错误:arr=np.array([[1,3,5],[7,9,11]);lIndexes=[[0,1],[1,0],[1,2]]np.add.at(arr,lIndexes,1)有什么想法吗?我建议将这个关于多维索引的新问题作为一个单独的问题发布。