2016-11-24 126 views
2

我正在尝试使用numpy数组索引(没有显式迭代数组)。只是为了检查是否按预期工作我做了如下测试:修改具有多重索引的索引数组的numpy数组

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.]

(即它忽略了它出现在索引阵列多次索引)

我不知道是否有某种原因,这种行为(也许是为了让这些独立经营秩序,因此更容易paralellize)。

有没有其他方法如何在numpy中做到这一点?

+0

你的脚本做是添加+1到INDS指定的ARR指标即在索引(1,2,3,5) – Jalo

回答

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] 

和改编将采取以下形式:

array([ 0., 2., 1., 3., 0., 1., 0., 0., 0., 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

+0

你不回答OP问题 – Jalo

+1

实际上它很好地回答了我的问题......我想知道没有只有如何制作直方图,而且一般情况下将来如何使用numpy索引,以及“为什么”就是这样。 –

+0

@ProkopHapala我想你想知道为什么它不工作。但是,我认为答案必须集中在主要问题上。进一步的澄清当然是受欢迎的,但是这个信息本身并不能使答案有效,在我的判断中 – Jalo