我尝试使用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中有没有其他方法可以做到这一点?
答案 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.])