2016-11-23 65 views
0

numpy有沒有一種方法可以確保對重複位置的數組操作映射進行縮減,即它們都是在彼此的結果上執行的?確保將numpy數組操作映射並行減少到重複位置

a = numpy.zeros([4], int) # [0 0 0 0] 
b = numpy.arange(0, 8) # [0 1 2 3 4 5 6 7] 

positions = [0, 0, 1, 1, 2, 2, 3, 3] 

a[positions] += b   

# desired result: [0 + 1, 2 + 3, 4 + 5, 6 + 7] 
# actual result: random crossover between [0, 2, 4, 6] and [1, 3, 5, 7] 

,你可以看到這兩個元素1和B圖2位置1和等等,我需要確保+ =增加了兩個,而默認情況下它看起來像它可以隨機增加1或2同時爲零,然後將結果存儲兩次,而這又是僅有一個操作的結果

+0

我總是得到[1,3 ,5,7]。你在什麼版本上? – kezzos

+0

沒關係,它是錯誤的組合之一 – Michele

回答

3

當存在重複的索引時,numpy數組中原地添加的行爲是未定義的。要確保您想要的行爲,請使用numpy.add.at。 (所有numpy的 「ufuncs」 有at method

例如,這裏是你的陣列:

In [21]: a 
Out[21]: array([0, 0, 0, 0]) 

In [22]: b 
Out[22]: array([0, 1, 2, 3, 4, 5, 6, 7]) 

In [23]: positions 
Out[23]: [0, 0, 1, 1, 2, 2, 3, 3] 

使用numpy.add.at積累值:

In [24]: np.add.at(a, positions, b) 

In [25]: a 
Out[25]: array([ 1, 5, 9, 13]) 
+0

完美,謝謝! – Michele