2014-01-22 49 views
9

在Python中,我可以通過多重情感交換來交換2個變量;它的工作原理也與清單:Numpy中的行交換

l1,l2=[1,2,3],[4,5,6] 
l1,l2=l2,l1 
print(l1,l2) 
>>> [4, 5, 6] [1, 2, 3] 

但是,當我想換2行的numpy的陣列(例如在高斯算法),它失敗:

import numpy as np 
a3=np.array([[1,2,3],[4,5,6]]) 
print(a3) 
a3[0,:],a3[1,:]=a3[1,:],a3[0,:] 
print(a3) 
>>> [[1 2 3] 
    [4 5 6]] 
    [[4 5 6] 
    [4 5 6]] 

我認爲,對於一個奇怪的原因,這兩列現在指向相同的價值觀;但事實並非如此,因爲a3[0,0]=5之前的行改變了a3 [0,0]而不是a3 [1,0]。

我發現如何解決這個問題:例如a3[0,:],a3[1,:]=a3[1,:].copy(),a3[0,:].copy()的作品。但任何人都可以解釋爲什麼與多個情感交換失敗與numpy行?我的問題涉及Python和Numpy的基礎工作。

+2

請參閱[這個問題的答案](http://stackoverflow.com/a/14933939/1600898)的解釋。 – user4815162342

+0

好的,謝謝,這個問題不是在可能的重複列表中自動提出的。 – JPG

+0

沒問題 - 我知道的唯一原因是因爲我回答了。 – user4815162342

回答

14

這工作,你就打算方式:

a3[[0,1]] = a3[[1,0]] 

兩元組分配不同的任務不是對於海誓山盟緩衝;一個發生在另一個之後,導致覆蓋你的觀察

+0

+1當你嘗試做一個[a [[0,1,1]] + = 1'並且位置'1'上的項目只增加一次時,討厭什麼是可以用來交換行。 – Jaime

+0

是的;我花了一段時間才明白其背後的邏輯。很高興與新的np.add.at;事實上,我現在正在編寫一段代碼,那曾經是一個非常慢的python循環。 –

+0

對於總和,'np.bincount'通常比'np.add.at'快50倍,在這裏我只是試過:'a = np.zeros((1000,),dtype = np.intp); b = np.random.randint(1000,size = 100000); c = np.random.randint(1000000,size = 100000);在[10]中:%timeit np.add.at(a,b,c); 100次循環,最好3次:每循環19.3毫秒;在[11]中:%timeit a + np.bincount(b,weights = c,minlength = 1000); 1000個循環,最好是每個循環3:451μs。 – Jaime