解决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 相关文章推荐
Python使用django搭建web开发环境
Jun 09 Python
Python sqlite3事务处理方法实例分析
Jun 19 Python
django开发post接口简单案例,获取参数值的方法
Dec 11 Python
pycharm创建一个python包方法图解
Apr 10 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
Jul 22 Python
python将邻接矩阵输出成图的实现
Nov 21 Python
如何基于Python制作有道翻译小工具
Dec 16 Python
基于梯度爆炸的解决方法:clip gradient
Feb 04 Python
解决pyqt5异常退出无提示信息的问题
Apr 08 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
Apr 16 Python
Python requests模块安装及使用教程图解
Jun 30 Python
小白教你PyCharm从下载到安装再到科学使用PyCharm2020最新激活码
Sep 25 Python
用Python实现Newton插值法
Apr 17 #Python
Python+Appium新手教程
Pytest之测试命名规则的使用
Apr 16 #Python
pycharm debug 断点调试心得分享
Python通过m3u8文件下载合并ts视频的操作
Python实现Telnet自动连接检测密码的示例
AI:如何训练机器学习的模型
You might like
模仿OSO的论坛(五)
2006/10/09 PHP
php Http_Template_IT类库进行模板替换
2009/03/19 PHP
php设计模式小结
2013/02/15 PHP
PHP中可以自动分割查询字符的Parse_str函数使用示例
2014/07/25 PHP
codeigniter上传图片不能正确识别图片类型问题解决方法
2014/07/25 PHP
javascript String 的扩展方法集合
2008/06/01 Javascript
jQuery ajax在GBK编码下表单提交终极解决方案(非二次编码方法)
2010/10/20 Javascript
jQuery .tmpl(), .template()学习资料小结
2011/07/18 Javascript
jQuery 选择表格(table)里的行和列及改变简单样式
2012/12/15 Javascript
jQuery经过一段时间自动隐藏指定元素的方法
2015/03/17 Javascript
jQuery实现不断闪烁文字的方法
2015/05/15 Javascript
详解JavaScript中数组的相关知识
2015/07/29 Javascript
javascript每日必学之运算符
2016/02/16 Javascript
javascript事件处理模型实例说明
2016/05/31 Javascript
jQuery实现的无缝广告图片左右滚动功能详解
2016/12/24 Javascript
javascript中replace使用方法总结
2017/03/01 Javascript
代码详解javascript模块加载器
2018/03/04 Javascript
解决Mac下安装nmp的淘宝镜像失败问题
2018/05/16 Javascript
vue通过数据过滤实现表格合并
2020/11/30 Javascript
JavaScript实现点击切换功能
2021/01/27 Javascript
解决Python网页爬虫之中文乱码问题
2018/05/11 Python
python3将视频流保存为本地视频文件
2018/06/20 Python
Python 操作 ElasticSearch的完整代码
2019/08/04 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
2020/05/11 Python
TensorFlow的环境配置与安装教程详解(win10+GeForce GTX1060+CUDA 9.0+cuDNN7.3+tensorflow-gpu 1.12.0+python3.5.5)
2020/06/22 Python
Python通过队列来实现进程间通信的示例
2020/10/14 Python
python3 kubernetes api的使用示例
2021/01/12 Python
JSF面试题:Jsf中导航的标签是什么
2013/04/20 面试题
Why we need EJB
2016/10/20 面试题
优秀应届生推荐信
2013/11/09 职场文书
优秀班集体获奖感言
2014/02/03 职场文书
《悯农》教学反思
2014/04/28 职场文书
青年志愿者先进事迹
2014/05/06 职场文书
党的群众路线教育实践活动党员个人整改措施
2014/10/27 职场文书
2014年办公室个人工作总结
2014/11/12 职场文书
Redis基本数据类型Zset有序集合常用操作
2022/06/01 Redis