解决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之yield表达式学习
Sep 02 Python
Python应用03 使用PyQT制作视频播放器实例
Dec 07 Python
Python之日期与时间处理模块(date和datetime)
Feb 16 Python
Python单元测试实例详解
May 25 Python
Python二进制串转换为通用字符串的方法
Jul 23 Python
Python 类属性与实例属性,类对象与实例对象用法分析
Sep 20 Python
Python编写打字训练小程序
Sep 26 Python
PyCharm第一次安装及使用教程
Jan 08 Python
Python第三方库的几种安装方式(小结)
Apr 03 Python
python中wx模块的具体使用方法
May 15 Python
python基于opencv批量生成验证码的示例
Apr 28 Python
python实现三次密码验证的示例
Apr 29 Python
用Python实现Newton插值法
Apr 17 #Python
Python+Appium新手教程
Pytest之测试命名规则的使用
Apr 16 #Python
pycharm debug 断点调试心得分享
Python通过m3u8文件下载合并ts视频的操作
Python实现Telnet自动连接检测密码的示例
AI:如何训练机器学习的模型
You might like
PHP游戏编程25个脚本代码
2011/02/08 PHP
php二维数组排序与默认自然排序的方法介绍
2013/04/27 PHP
PHP使用Session遇到的一个Permission denied Notice解决办法
2014/07/30 PHP
php+xml编程之SimpleXML的应用实例
2015/01/24 PHP
php web环境和命令行环境下查找php.ini的位置
2019/07/17 PHP
用jquery.sortElements实现table排序
2014/05/04 Javascript
jQuery mobile 移动web(6)
2015/12/20 Javascript
一些实用性较高的js方法
2016/04/19 Javascript
浅谈JavaScript中数组的增删改查
2016/06/20 Javascript
基于js实现checkbox批量选中操作
2016/11/22 Javascript
微信小程序 常见问题总结(4058,40013)及解决办法
2017/01/11 Javascript
nodejs中sleep功能实现暂停几秒的方法
2017/07/12 NodeJs
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
2017/09/21 Javascript
微信小程序出现wx.navigateTo页面不跳转问题的解决方法
2017/12/26 Javascript
C#程序员入门学习微信小程序的笔记
2019/03/05 Javascript
在Vue中获取自定义属性方法:data-id的实例
2020/09/09 Javascript
Vant 在vue-cli 4.x中按需加载操作
2020/11/05 Javascript
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
python3实现ftp服务功能(客户端)
2017/03/24 Python
对Python捕获控制台输出流的方法详解
2019/01/07 Python
Python编写合并字典并实现敏感目录的小脚本
2019/02/26 Python
pandas实现将dataframe满足某一条件的值选出
2019/06/12 Python
Python多线程thread及模块使用实例
2020/04/28 Python
华为旗下电子商务平台:华为商城
2016/08/06 全球购物
香蕉共和国工厂店:Banana Republic Factory
2018/06/09 全球购物
King Apparel官网:英国街头服饰品牌
2019/09/05 全球购物
竞选学生会主席演讲稿
2014/04/24 职场文书
节水标语大全
2014/06/11 职场文书
城市规划应届毕业生自荐信
2014/07/04 职场文书
2014员工聘用协议书(最新版)
2014/11/24 职场文书
初中政治教学工作总结
2015/08/13 职场文书
2016读书月活动心得体会
2016/01/14 职场文书
详解Python中下划线的5种含义
2021/07/15 Python
windows11怎么查看自己安装的版本号? win11版本号的查看方法
2021/11/21 数码科技
《巫师》是美食游戏?CDPR10月将推出《巫师》官方食谱
2022/04/03 其他游戏
Java实现简单小画板
2022/06/10 Java/Android