2016-11-24 98 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