2015-12-03 174 views
3

我試圖高效地更新numpy數組A的某些元素,使用另一個數組b來指示要更新的A元素的索引。但是,b可以包含被忽略的重複項,但我希望將其考慮在內。我想避免循環b。爲了說明它:使用數組作爲索引增加numpy數組元素

>>> A = np.arange(10).reshape(2,5) 
>>> A[0, np.array([1,1,1,2])] += 1 
>>> A 
array([[0, 2, 3, 3, 4], 
     [5, 6, 7, 8, 9]]) 

,而我想的輸出是:

array([[0, 3, 3, 3, 4], 
     [5, 6, 7, 8, 9]]) 

任何想法?

+0

索引中的陣列,列指數1時的3倍。如果您希望元素的數量與索引發生的次數相同,則元素[0,1]應該變成1 + 3 = 4. –

回答

4

要正確處理重複索引,您需要使用np.add.at而不是+=。因此,更新的A第一行,最簡單的方法很可能是做到以下幾點:

>>> np.add.at(A[0], [1,1,1,2], 1) 
>>> A 
array([[0, 4, 3, 3, 4], 
     [5, 6, 7, 8, 9]]) 

ufunc.at方法的文件可以發現here

+0

謝謝。它按預期工作。謝謝你的指針,我不知道這個功能,這是非常有用的。 – geompalik

0

一種方法是使用numpy.histogram找出有多少個值均爲指數,然後將結果添加到A

A[0, :] += np.histogram(np.array([1,1,1,2]), bins=np.arange(A.shape[1]+1))[0] 
+0

感謝您的回答,但我認爲接受的更直觀。 – geompalik