解決numpy數組互換兩行及賦值的問題
看代碼吧~
import numpy as np a = np.array([[1,1,1],[2,2,2],[3,3,3], [4,4,4]]) tmp = a[1] a[1] = a[2] a[2] = tmp
tmp隻是a[1]的另一個名字,它並不是將a[1]復制瞭之後,就與a[1]無關,或許可理解為一種引用。所以這段代碼的效果並不能如願互換原始a數組的第2行和第三行,而是會將2,3行都變成原來的第三行[3,3,3],像這樣:
array([[1, 1, 1], [3, 3, 3], [3, 3, 3], [4, 4, 4]])
那麼如果想互換兩行,應該怎麼操作呢?
有兩種方法,第一種很簡便:
a[[1,2], :] = a[[2,1], :]
這樣就將數組a的第2行和第3行互換瞭。或者,寫得更易理解一點,也可以這樣一步一步寫:
tmp = np.copy(a[1]) a[1] = a[2] a[2] = tmp
這兩種寫法都可以將數組a的第2,3行互換,即可以得到:
array([[1, 1, 1], [3, 3, 3], [2, 2, 2], [4, 4, 4]])
補充:numpy數組行交換的bug
今日發現一個小問題,還好自己發現瞭,不然這個bug不知道要背鍋好久
實驗要求:
交換一個numpy數組中的第i行和第j行
上代碼:
import numpy as np arr = np.asarray([[1,2,3], [4,5,6], [7,8,9]]) print(arr) tmp = arr[2] arr[2] = arr[0] arr[0] = tmp print(arr)
打印結果:
[[1 2 3] [4 5 6] [7 8 9]] [[1 2 3] [4 5 6] [1 2 3]]
這個結果打印出來,整個人傻眼瞭
為瞭搞懂為啥是這個結果,我打印變量tmp看看
import numpy as np arr = np.asarray([[1,2,3], [4,5,6], [7,8,9]]) print(arr) tmp = arr[2] print(tmp) arr[2] = arr[0] print(tmp) arr[0] = tmp print(arr)
打印結果:
[[1 2 3] [4 5 6] [7 8 9]] #原始的arr [7 8 9] #第一次打印tmp [1 2 3] #第二次打印tmp [[1 2 3] [4 5 6] [1 2 3]] #交換後的arr
這樣就發現瞭問題,這是python的特性,變量tmp不是copy瞭arr[2]的數值,而是類似於C中的指針,指在瞭arr[2]的地址上,當執行arr[2] = arr[0]後,arr[2]的數值發生瞭變化,所以tmp也發生瞭變化
而處理的辦法也很簡單,變量tmp深度copy arr[2]就行,即:tmp = arr[2].copy()
import numpy as np arr = np.asarray([[1,2,3], [4,5,6], [7,8,9]]) print(arr) tmp = arr[2].copy() print(tmp) arr[2] = arr[0] print(tmp) arr[0] = tmp print(arr)
打印結果:
[[1 2 3] [4 5 6] [7 8 9]] #原始的arr [7 8 9] #第一次打印tmp [7 8 9] #第二次打印tmp [[7 8 9] [4 5 6] [1 2 3]] #交換後的arr
搞定~
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- None Found