解決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