解决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的模版来配合字符串翻译工作
Jul 27 Python
Python装饰器基础详解
Mar 09 Python
python实现Decorator模式实例代码
Feb 09 Python
利用python的socket发送http(s)请求方法示例
May 07 Python
Python动态生成多维数组的方法示例
Aug 09 Python
python 运用Django 开发后台接口的实例
Dec 11 Python
浅谈python 中类属性共享的问题
Jul 02 Python
Atom Python 配置Python3 解释器的方法
Aug 28 Python
关于numpy中eye和identity的区别详解
Nov 29 Python
pycharm无法导入本地模块的解决方式
Feb 12 Python
python海龟绘图之画国旗实例代码
Nov 11 Python
python自动打开浏览器下载zip并提取内容写入excel
Jan 04 Python
用Python实现Newton插值法
Apr 17 #Python
Python+Appium新手教程
Pytest之测试命名规则的使用
Apr 16 #Python
pycharm debug 断点调试心得分享
Python通过m3u8文件下载合并ts视频的操作
Python实现Telnet自动连接检测密码的示例
AI:如何训练机器学习的模型
You might like
PHP自定session保存路径及删除、注销与写入的方法
2014/11/18 PHP
微信公众平台消息接口校验与消息接口响应实例
2014/12/23 PHP
PHP数据库操作二:memcache用法分析
2017/08/16 PHP
js window.print实现打印特定控件或内容
2013/09/16 Javascript
jquery实现下拉菜单的二级联动利用json对象从DB取值显示联动
2014/03/27 Javascript
jQuery通过点击行来删除HTML表格行的实现示例
2014/09/10 Javascript
JavaScript实现将文本框的值插入指定位置的方法
2015/08/13 Javascript
分享五个有用的jquery小技巧
2015/10/08 Javascript
jQuery soColorPacker 网页拾色器
2016/06/22 Javascript
JS之相等操作符详解
2016/09/13 Javascript
jQuery Ajax File Upload实例源码
2016/12/12 Javascript
原生JS实现自定义滚动条效果
2020/10/27 Javascript
cocos creator Touch事件应用(触控选择多个子节点的实例)
2017/09/10 Javascript
解决vue打包之后静态资源图片失效的问题
2018/02/21 Javascript
JS实现区分中英文并统计字符个数的方法示例
2018/06/09 Javascript
微信小程序新手教程之启动页的重要性
2019/03/03 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
2019/07/16 Javascript
vue-cli3配置与跨域处理方法
2019/08/17 Javascript
python数据结构之链表详解
2017/09/12 Python
Python实现的插入排序算法原理与用法实例分析
2017/11/22 Python
详解用python实现简单的遗传算法
2018/01/02 Python
Matplotlib中文乱码的3种解决方案
2018/11/15 Python
Django在admin后台集成TinyMCE富文本编辑器的例子
2019/08/09 Python
Django media static外部访问Django中的图片设置教程
2020/04/07 Python
Python爬虫新手入门之初学lxml库
2020/12/20 Python
奠基仪式主持词
2014/03/20 职场文书
陈胜吴广起义口号
2014/06/20 职场文书
班级文化建设标语
2014/06/23 职场文书
创建绿色社区汇报材料
2014/08/22 职场文书
初中班长竞选稿
2015/11/20 职场文书
2016幼儿园毕业感言
2015/12/08 职场文书
银行求职信怎么写
2019/06/20 职场文书
2019年个人工作总结范文(3篇)
2019/08/27 职场文书
解决Jupyter-notebook不弹出默认浏览器的问题
2021/03/30 Python
mongodb清除连接和日志的正确方法分享
2021/09/15 MongoDB
Java中的Kafka为什么性能这么快及4大核心详析
2022/09/23 Java/Android