解决numpy数组互换两行及赋值的问题


Posted in Python onApril 17, 2021

看代码吧~

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

搞定~

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Python 相关文章推荐
在 Django/Flask 开发服务器上使用 HTTPS
Jul 03 Python
浅谈python中字典append 到list 后值的改变问题
May 04 Python
在python中利用GDAL对tif文件进行读写的方法
Nov 29 Python
用Python将结果保存为xlsx的方法
Jan 28 Python
Python线程之定位与销毁的实现
Feb 17 Python
Python正则表达式匹配数字和小数的方法
Jul 03 Python
Django对models里的objects的使用详解
Aug 17 Python
python 实现多线程下载m3u8格式视频并使用fmmpeg合并
Nov 15 Python
Python迭代器模块itertools使用原理解析
Dec 11 Python
python orm 框架中sqlalchemy用法实例详解
Feb 02 Python
python导入库的具体方法
Jun 18 Python
Django怎么在admin后台注册数据库表
Nov 14 Python
用Python实现Newton插值法
Apr 17 #Python
Python+Appium新手教程
Pytest之测试命名规则的使用
Apr 16 #Python
pycharm debug 断点调试心得分享
Python通过m3u8文件下载合并ts视频的操作
Python实现Telnet自动连接检测密码的示例
AI:如何训练机器学习的模型
You might like
关于二级目录拖拽排序的实现(源码示例下载)
2013/04/26 PHP
PHP开发注意事项总结
2015/02/04 PHP
php 利用array_slice函数获取随机数组或前几条数据
2015/09/30 PHP
phpinfo无法显示的原因及解决办法
2019/02/15 PHP
javascript之卸载鼠标事件的代码
2007/05/14 Javascript
firefo xml 读写实现js代码
2009/06/11 Javascript
jQuery的live()方法对hover事件的处理示例
2014/02/27 Javascript
Nodejs极简入门教程(二):定时器
2014/10/25 NodeJs
javascript实现简单的贪吃蛇游戏
2015/03/31 Javascript
JavaScript中exec函数用法实例分析
2015/06/08 Javascript
zTree插件下拉树使用入门教程
2016/04/11 Javascript
JavaScript实现汉字转换为拼音的库文件示例
2016/12/22 Javascript
微信小程序开发(二)图片上传+服务端接收详解
2017/01/11 Javascript
boostrapTable的refresh和refreshOptions区别浅析
2017/01/22 Javascript
Angular 4环境准备与Angular cli创建项目详解
2017/05/27 Javascript
jquery处理checkbox(复选框)是否被选中实例代码
2017/06/12 jQuery
JavaScript实现提交模式窗口后刷新父窗口数据的方法
2017/06/16 Javascript
node前端模板引擎Jade之标签的基本写法
2018/05/11 Javascript
JS实现长图上下滚动效果
2020/03/19 Javascript
[02:25]DOTA2英雄基础教程 熊战士
2014/01/03 DOTA
python在Windows8下获取本机ip地址的方法
2015/03/14 Python
Python使用wxPython实现计算器
2018/01/30 Python
使用python生成杨辉三角形的示例代码
2018/08/29 Python
python卸载后再次安装遇到的问题解决
2019/07/10 Python
python数值基础知识浅析
2019/11/19 Python
利用PyQt5+Matplotlib 绘制静态/动态图的实现代码
2020/07/13 Python
德国家具在线:Fashion For Home
2017/03/11 全球购物
Trunki英国官网:儿童坐骑式行李箱
2017/05/30 全球购物
The North Face北面美国官网:美国著名户外品牌
2018/09/15 全球购物
Nike意大利官网:Nike.com IT
2020/01/19 全球购物
什么是SQL Server的确定性函数和不确定性函数
2016/08/04 面试题
总裁岗位职责
2013/12/04 职场文书
产品推广策划方案
2014/05/10 职场文书
医院义诊活动总结
2014/07/04 职场文书
毕业生对母校寄语
2015/02/26 职场文书
3招让你摆脱即兴讲话冷场尴尬
2019/08/08 职场文书