Numpy数组赋值操作用数组索引

时间:2013-12-27 17:31:30

标签: python arrays numpy

我有一个数组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])

我希望xarray([0, 3, 0, 0, 1])x[1]应增加两倍, 但我得到它x[1]只增加一个。

我怎么能这样做?为什么会这样?

2 个答案:

答案 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)将增加第一个元素两次。