看代码吧~
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