解决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日期操作学习笔记
Oct 07 Python
Python字典及字典基本操作方法详解
Jan 30 Python
Python基础教程之利用期物处理并发
Mar 29 Python
简单谈谈Python的pycurl模块
Apr 07 Python
python筛选出两个文件中重复行的方法
May 31 Python
结合OpenCV与TensorFlow进行人脸识别的实现
Oct 10 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
Dec 18 Python
python中sys模块是做什么用的
Aug 16 Python
OpenCV图片漫画效果的实现示例
Aug 18 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
Sep 23 Python
Cpython解释器中的GIL全局解释器锁
Nov 09 Python
Python从文件中读取数据的方法步骤
Nov 18 Python
用Python实现Newton插值法
Apr 17 #Python
Python+Appium新手教程
Pytest之测试命名规则的使用
Apr 16 #Python
pycharm debug 断点调试心得分享
Python通过m3u8文件下载合并ts视频的操作
Python实现Telnet自动连接检测密码的示例
AI:如何训练机器学习的模型
You might like
丧钟首部独立剧集《丧钟:骑士与龙》北美正式开播,场面血腥
2020/04/09 欧美动漫
世界收音机发展史
2021/03/01 无线电
php修改数组键名的方法示例
2017/04/15 PHP
php之header的不同用法总结(实例讲解)
2017/11/28 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
ExtJS4 表格的嵌套 rowExpander应用
2014/05/02 Javascript
纯js和css实现渐变色包括静态渐变和动态渐变
2014/05/29 Javascript
JQEasy-ui在IE9以下版本中二次加载的问题分析及处理方法
2014/06/23 Javascript
jQuery中attr()和prop()在修改checked属性时的区别
2014/07/18 Javascript
Angularjs material 实现搜索框功能
2016/03/08 Javascript
JS组件Bootstrap Table布局详解
2016/05/27 Javascript
jQuery纵向导航菜单效果实现方法
2016/12/19 Javascript
微信小程序多列选择器range-key使用详解
2020/03/30 Javascript
vue-cli项目中怎么使用mock数据
2017/09/27 Javascript
javascript获取图片的top N主色值方法详解
2018/01/26 Javascript
Vue实现商品飞入购物车效果(电商项目)
2019/11/26 Javascript
微信小程序顶部导航栏可滑动并选中放大
2019/12/05 Javascript
[02:14]完美“圣”典2016风云人物:xiao8专访
2016/12/01 DOTA
[11:42]2018DOTA2国际邀请赛寻真——OG卷土重来
2018/08/17 DOTA
web.py在模板中输出美元符号的方法
2014/08/26 Python
介绍Python中的一些高级编程技巧
2015/04/02 Python
Python 类与元类的深度挖掘 II【经验】
2016/05/06 Python
举例讲解Python中字典的合并值相加与异或对比
2016/06/04 Python
Python浅复制中对象生存周期实例分析
2018/04/02 Python
浅谈pycharm使用及设置方法
2019/09/09 Python
python实现串口通信的示例代码
2020/02/10 Python
python 回溯法模板详解
2020/02/26 Python
15个应该掌握的Jupyter Notebook使用技巧(小结)
2020/09/23 Python
html5使用canvas实现跟随光标跳动的火焰效果
2014/01/07 HTML / CSS
Jacadi Paris美国官方网站:法国童装品牌
2017/10/15 全球购物
提高EJB性能都有哪些技巧
2012/03/25 面试题
优秀学生干部个人的自我评价
2013/10/04 职场文书
2014年流动人口工作总结
2014/11/26 职场文书
毕业生个人自荐书
2015/03/05 职场文书
《秋天的怀念》教学反思
2016/02/17 职场文书
Python获取字典中某个key的value
2022/04/13 Python