使用重复索引增加Numpy数组

时间:2010-01-05 05:37:24

标签: 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()                        # 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.bincountnp.unique操作会导致相同的排序顺序,是否存在风险?我错过了一些简单的Numpy操作来解决这个问题吗?

4 个答案:

答案 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)

如果ba的一个小子范围,可以像这样改进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