看代码吧~
1
2
3
4
5
|
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],像这样:
1
2
3
4
|
array([[ 1 , 1 , 1 ], [ 3 , 3 , 3 ], [ 3 , 3 , 3 ], [ 4 , 4 , 4 ]]) |
那么如果想互换两行,应该怎么操作呢?
有两种方法,第一种很简便:
1
|
a[[ 1 , 2 ], :] = a[[ 2 , 1 ], :] |
这样就将数组a的第2行和第3行互换了。或者,写得更易理解一点,也可以这样一步一步写:
1
2
3
|
tmp = np.copy(a[ 1 ]) a[ 1 ] = a[ 2 ] a[ 2 ] = tmp |
这两种写法都可以将数组a的第2,3行互换,即可以得到:
1
2
3
4
|
array([[ 1 , 1 , 1 ], [ 3 , 3 , 3 ], [ 2 , 2 , 2 ], [ 4 , 4 , 4 ]]) |
补充:numpy数组行交换的bug
今日发现一个小问题,还好自己发现了,不然这个bug不知道要背锅好久
实验要求:
交换一个numpy数组中的第i行和第j行
上代码:
1
2
3
4
5
6
7
8
9
10
|
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
|
[[ 1 2 3 ] [ 4 5 6 ] [ 7 8 9 ]] [[ 1 2 3 ] [ 4 5 6 ] [ 1 2 3 ]] |
这个结果打印出来,整个人傻眼了
为了搞懂为啥是这个结果,我打印变量tmp看看
1
2
3
4
5
6
7
8
9
10
11
12
|
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
10
11
|
[[ 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()
1
2
3
4
5
6
7
8
9
10
11
12
|
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
10
11
|
[[ 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 |
搞定~
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。
原文链接:https://blog.csdn.net/grace_cxj/article/details/80964064