解决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基于win32ui模块创建弹出式菜单示例
May 09 Python
Django 根据数据模型models创建数据表的实例
May 27 Python
Python根据指定日期计算后n天,前n天是哪一天的方法
May 29 Python
Python 使用PIL中的resize进行缩放的实例讲解
Aug 03 Python
python3 实现一行输入,空格隔开的示例
Nov 14 Python
python+selenium 定位到元素,无法点击的解决方法
Jan 30 Python
python实现爬虫抓取小说功能示例【抓取金庸小说】
Aug 09 Python
Python 改变数组类型为uint8的实现
Apr 09 Python
在python中利用pycharm自定义代码块教程(三步搞定)
Apr 15 Python
Anaconda使用IDLE的实现示例
Sep 23 Python
Python中读取文件名中的数字的实例详解
Dec 25 Python
如何使用Tkinter进行窗口的管理与设置
Jun 30 Python
用Python实现Newton插值法
Apr 17 #Python
Python+Appium新手教程
Pytest之测试命名规则的使用
Apr 16 #Python
pycharm debug 断点调试心得分享
Python通过m3u8文件下载合并ts视频的操作
Python实现Telnet自动连接检测密码的示例
AI:如何训练机器学习的模型
You might like
PHP+ajax 无刷新删除数据
2010/02/20 PHP
CodeIgniter表单验证方法实例详解
2016/03/03 PHP
[原创]PHP正则删除html代码中a标签并保留标签内容的方法
2017/05/23 PHP
PHP获取本周所有日期或者最近七天所有日期的方法
2018/06/20 PHP
PHP unset函数原理及使用方法解析
2020/08/14 PHP
浅析js中取绝对值的2种方法
2013/07/09 Javascript
SyntaxHighlighter 3.0.83使用笔记
2015/01/26 Javascript
jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果
2015/10/28 Javascript
Nodejs中session的简单使用及通过session实现身份验证的方法
2016/02/04 NodeJs
jQuery点击其他地方时菜单消失的实现方法
2016/04/22 Javascript
基于BootStrap Metronic开发框架经验小结【三】下拉列表Select2插件的使用
2016/05/12 Javascript
分享jQuery网页元素拖拽插件
2020/12/01 Javascript
Angularjs实现mvvm式的选项卡示例代码
2016/09/08 Javascript
d3.js实现立体柱图的方法详解
2017/04/28 Javascript
在原生不支持的旧环境中添加兼容的Object.keys实现方法
2017/09/11 Javascript
Vue配合iView实现省市二级联动的示例代码
2018/07/27 Javascript
浅谈js中的bind
2019/03/18 Javascript
Vue中通过Vue.extend动态创建实例的方法
2019/08/13 Javascript
[03:22]DAC最前线(第二期)—DOTA2亚洲邀请赛主赛场周边及线路探访
2015/01/24 DOTA
整理Python最基本的操作字典的方法
2015/04/24 Python
Python安装使用命令行交互模块pexpect的基础教程
2016/05/12 Python
python实现12306火车票查询器
2017/04/20 Python
Python实现向服务器请求压缩数据及解压缩数据的方法示例
2017/06/09 Python
python中字符串比较使用is、==和cmp()总结
2018/03/18 Python
Python 编码规范(Google Python Style Guide)
2018/05/05 Python
python读取txt文件,去掉空格计算每行长度的方法
2018/12/20 Python
Python3.5面向对象程序设计之类的继承和多态详解
2019/04/24 Python
Django框架自定义模型管理器与元选项用法分析
2019/07/22 Python
CSS3的Flexbox布局的简明入门指南
2016/04/08 HTML / CSS
websocket+sockjs+stompjs详解及实例代码
2018/11/30 HTML / CSS
食堂员工工作职责
2013/12/18 职场文书
班级德育工作实施方案
2014/02/21 职场文书
会计专业个人自我鉴定
2014/03/21 职场文书
土木工程专业本科生求职信
2014/10/01 职场文书
税务会计岗位职责
2015/04/02 职场文书
自我检讨书怎么写
2015/05/07 职场文书