我有一个数组y
,其索引值必须在另一个数组x
中递增一个
就像x[y] += 1
一样,这是一个例子:
>>> x = np.zeros(5,dtype=np.int)
>>> y = np.array([1,4])
>>> x
array([0, 0, 0, 0, 0])
>>> x[y] += 1
>>> x
array([0, 1, 0, 0, 1])
到目前为止一直很好,但后来我遇到了这个问题:
>>> x
array([0, 1, 0, 0, 1])
>>> y = np.array([1,1])
>>> x
array([0, 1, 0, 0, 1])
>>> x[y] += 1
>>> x
array([0, 2, 0, 0, 1])
我希望x
为array([0, 3, 0, 0, 1])
:x[1]
应增加两倍,
但我得到它x[1]
只增加一个。
我怎么能这样做?为什么会这样?
答案 0 :(得分:3)
这样做:
>>> x=np.array([0, 0, 0, 0, 0])
>>> y=np.array([1,4])
>>> x+=np.bincount(y, minlength=x.size)
>>> x
array([0, 1, 0, 0, 1])
>>> y=np.array([1,1])
>>> x+=np.bincount(y, minlength=x.size)
>>> x
array([0, 3, 0, 0, 1])
>>> map(id, x[y])
[20481944, 20481944]
x[1,1]
仅引用相同的元素,+1
因此仅对一个元素起作用。
答案 1 :(得分:2)
x[y] += 1
相当于
x[y] = x[y] + 1
x[y]+1
# array([2, 2])
有效地numpy
并行操作这些术语,而不是按顺序操作。
x[y]=[4,3] # or
x[y] += [4,3]
建议如果为同一个术语指定了不同的值,那么这是一个有效的最后一个动作(但可能无法保证)。
np.add.at(x,y,1)
做你期望的事。
来自np.add.at
的文档:
对于添加ufunc,此方法相当于
a[indices] += b
,除了为元素累积结果 被索引不止一次。例如,a[[0,0]] += 1
只会 因缓冲而增加第一个元素,而add.at(a, [0,0], 1)
将增加第一个元素两次。