解决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脚本在Linux下实现部分Bash Shell的教程
Apr 17 Python
python 重命名轴索引的方法
Nov 10 Python
python的几种矩阵相乘的公式详解
Jul 10 Python
Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
Jul 31 Python
django基于cors解决跨域请求问题详解
Aug 06 Python
Python中__repr__和__str__区别详解
Nov 07 Python
Django实现简单网页弹出警告代码
Nov 15 Python
使用python turtle画高达
Jan 19 Python
Python栈的实现方法示例【列表、单链表】
Feb 22 Python
PyPDF2读取PDF文件内容保存到本地TXT实例
May 12 Python
Anaconda3中的Jupyter notebook添加目录插件的实现
May 18 Python
Pyhton模块和包相关知识总结
May 12 Python
用Python实现Newton插值法
Apr 17 #Python
Python+Appium新手教程
Pytest之测试命名规则的使用
Apr 16 #Python
pycharm debug 断点调试心得分享
Python通过m3u8文件下载合并ts视频的操作
Python实现Telnet自动连接检测密码的示例
AI:如何训练机器学习的模型
You might like
PHP操作文件类的函数代码(文件和文件夹创建,复制,移动和删除)
2011/11/10 PHP
PHP小技巧之JS和CSS优化工具Minify的使用方法
2014/05/19 PHP
浅析PHP中的i++与++i的区别及效率
2016/06/15 PHP
PHP文件操作实例总结
2016/09/27 PHP
javascript操作cookie的文章(设置,删除cookies)
2010/04/01 Javascript
Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)
2010/06/11 Javascript
js解析与序列化json数据(三)json的解析探讨
2013/02/01 Javascript
Angular中的Promise对象($q介绍)
2015/03/03 Javascript
跟我学习javascript的prototype原型和原型链
2015/11/18 Javascript
jQuery实现的简单提示信息插件
2015/12/08 Javascript
jQuery 全选 全部选 反选 实现代码
2016/08/17 Javascript
微信小程序实现带刻度尺滑块功能
2017/03/29 Javascript
详解vue的数据binding绑定原理
2017/04/12 Javascript
详解react-native-fs插件的使用以及遇到的坑
2017/09/12 Javascript
微信小程序 如何引入外部字体库iconfont的图标
2018/01/31 Javascript
[06:07]辉夜杯现场观众互动 “比谁远送显示器”
2015/12/26 DOTA
使用Python的PEAK来适配协议的教程
2015/04/14 Python
Python中time模块与datetime模块在使用中的不同之处
2015/11/24 Python
Python环境下安装使用异步任务队列包Celery的基础教程
2016/05/07 Python
python/Matplotlib绘制复变函数图像教程
2019/11/21 Python
python 等差数列末项计算方式
2020/05/03 Python
Keras 在fit_generator训练方式中加入图像random_crop操作
2020/07/03 Python
python获取百度热榜链接的实例方法
2020/08/25 Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
2020/12/21 Python
css3实现文字扫光渐变动画效果的示例
2017/11/07 HTML / CSS
2013的个人自我评价
2013/12/26 职场文书
法制宣传教育方案
2014/05/09 职场文书
数学系毕业生求职信
2014/05/29 职场文书
创建文明城市标语
2014/06/16 职场文书
个人贷款收入证明
2014/10/26 职场文书
春季运动会开幕词
2015/01/28 职场文书
看完这篇文章获得一些java if优化技巧
2021/07/15 Java/Android
详解TypeScript的基础类型
2022/02/18 Javascript
MongoDB使用场景总结
2022/02/24 MongoDB
Java十分钟精通进阶适配器模式
2022/04/06 Java/Android
MySQL脏读,幻读和不可重复读
2022/05/11 MySQL