2011-08-02 82 views
4

我遇到數組索引問題。假設你有一個數組a和另一個數組b,你想用它作爲a的索引,以便爲b元素指向的位置分配一些值。使用具有冗餘元素的python數組索引python數組

a=numpy.zeros(5) 
print a 

[ 0. 0. 0. 0. 0.] 

現在我想增加第二個元素兩次

b=numpy.array([1,1]) 
a[b]+=1. 
print a 

[ 0. 1. 0. 0. 0.] 

,而我預計將有

[ 0. 2. 0. 0. 0.] 

有沒有問題,如果數組b中有沒有冗餘(所有值其元素不同)。 有人得到了避免使用for循環的問題的解決方案?這是一個在numpy中的錯誤? 在此先感謝

回答

7

當您使用整數數組索引另一個數組時,NumPy無法創建適當的視圖,因爲生成的數組可能無法用步幅表示。因此,它會返回一個副本:

>>> a = np.zeros(5) 
>>> b = np.array([1, 1]) 
>>> c = a[b] 
>>> c 
array([ 0., 0.]) 
>>> c.base is a 
False 

在使用該指標與像+=就地操作,NumPy的不同會比您預期的解釋。除了「遍歷索引數組並依次對每個元素執行操作」之外,它將首先選擇索引爲b的所有值(在這種情況下,僅索引爲1),然後對這些元素執行操作一次

+0

感謝明確的答案。在你看來,這個問題有沒有一個巧妙的方法(即可能使用數組或字典)?我正在與非常大的陣列,所以我會嘗試任何事情,以避免循環... – fightthewar

+1

你*嘗試*循環?它可能會很快*足夠*。 –

1

你可以試試:

a += numpy.histogram(b, numpy.arange(len(a)+1))[0] 

這將返回a = array([ 0., 2., 0., 0., 0.])

2

,或者您可以使用bincount():

a=numpy.zeros(5) 
idx = numpy.bincount([0,0,0,1,1,3,3]) 
a[:len(idx)]+=idx