使用具有多重索引的索引数组修改numpy数组

时间:2016-11-24 10:33:29

标签: python numpy

我尝试使用numpy数组索引(没有对数组进行显式迭代)来执行histrogram。只是为了检查它是否按预期工作,我做了以下测试:

import numpy as np

arr  = np.zeros(10)
inds = np.array([1,2,3,1,3,5,3])
arr[inds] += 1.0
print(arr)

结果是

[ 0. 1. 1. 1. 0. 1. 0. 0. 0. 0.]而不是

[ 0. 2. 1. 3. 0. 1. 0. 0. 0. 0.]

(即省略索引数组中多次出现的索引)

我不确定这种行为是否有某种原因(也许是为了使这些操作顺序独立,因此更容易进行并列化)。

在numpy中有没有其他方法可以做到这一点?

2 个答案:

答案 0 :(得分:0)

当您在numpy数组上执行多个赋值时,python会将赋值留给最后一个赋值。这一切都是出于逻辑问题。其中还有mentioned in document

a = np.arange(5)
a[[0,0,2]]+=1
a array([1, 1, 3, 3, 4])
     

即使0在索引列表中出现两次,第0个元素也只是递增一次。这是因为   Python要求a+=1等同于a=a+1

答案 1 :(得分:0)

OP脚本只将 +1 添加到inds中指定的 arr 索引,即索引(1,2,3,5)

适合您需要的NumPy函数是numpy.bincount()。 由于此函数的结果将具有size = inds.max(),因此您必须切片arr以指定将添加哪些索引。如果没有,形状就不会重合。

import numpy as np

arr  = np.zeros(10)
inds = np.array([1,2,3,1,3,5,3])
values = np.bincount(inds)
print values
arr[:values.size]+= values
print(arr)

值将是:

[0 2 1 3 0 1]

和arr将采用以下形式:

array([ 0., 2., 1., 3., 0., 1., 0., 0., 0., 0.])