解决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 socket.error: [Errno 98] Address already in use的原因和解决方法
Aug 25 Python
python对html代码进行escape编码的方法
May 04 Python
Python实现批量修改文件名实例
Jul 08 Python
详解python发送各类邮件的主要方法
Dec 22 Python
python使用SMTP发送qq或sina邮件
Oct 21 Python
Python实现可自定义大小的截屏功能
Jan 20 Python
对Xpath 获取子标签下所有文本的方法详解
Jan 02 Python
Python空间数据处理之GDAL读写遥感图像
Aug 01 Python
Python拼接字符串的7种方式详解
Mar 19 Python
Python定时任务APScheduler原理及实例解析
May 30 Python
Python join()函数原理及使用方法
Nov 14 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
Dec 14 Python
用Python实现Newton插值法
Apr 17 #Python
Python+Appium新手教程
Pytest之测试命名规则的使用
Apr 16 #Python
pycharm debug 断点调试心得分享
Python通过m3u8文件下载合并ts视频的操作
Python实现Telnet自动连接检测密码的示例
AI:如何训练机器学习的模型
You might like
PHP连接Nginx服务器并解析Nginx日志的方法
2015/08/16 PHP
Laravel5中防止XSS跨站攻击的方法
2016/10/10 PHP
PHP 表单提交及处理表单数据详解及实例
2016/12/27 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
浅谈PHP各环境下的伪静态配置
2019/03/13 PHP
laravel 数据验证规则详解
2019/10/23 PHP
Jquery读取URL参数小例子
2013/08/30 Javascript
Javascript之this关键字深入解析
2013/11/12 Javascript
javascript中解析四则运算表达式的算法和示例
2014/08/11 Javascript
封装属于自己的JS组件
2016/01/27 Javascript
AngularJS 2.0新特性有哪些
2016/02/18 Javascript
详解使用Node.js 将txt文件转为Excel文件
2017/07/05 Javascript
微信小程序实现拍照画布指定区域生成图片
2019/07/18 Javascript
js函数和this用法实例分析
2020/03/13 Javascript
[07:52]2014DOTA2 TI逗比武士游V社解说背后的故事
2014/07/10 DOTA
使用Python的PEAK来适配协议的教程
2015/04/14 Python
Python set常用操作函数集锦
2017/11/15 Python
Python多进程库multiprocessing中进程池Pool类的使用详解
2017/11/24 Python
Python的argparse库使用详解
2018/10/09 Python
解读python如何实现决策树算法
2018/10/11 Python
Python序列对象与String类型内置方法详解
2019/10/22 Python
详解如何用python实现一个简单下载器的服务端和客户端
2019/10/28 Python
Eclipse配置python默认头过程图解
2020/04/26 Python
Python程序慢的重要原因
2020/09/04 Python
python 实现全球IP归属地查询工具
2020/12/18 Python
什么是Oracle的后台进程background processes?都有哪些后台进程?
2012/04/26 面试题
简历中个人求职的自我评价模板
2013/11/29 职场文书
电钳专业个人求职信
2014/01/04 职场文书
护士自我评价
2014/02/01 职场文书
小学毕业感言300字
2014/02/19 职场文书
公证委托书
2014/08/01 职场文书
党员批评与自我批评发言材料
2014/10/14 职场文书
员工年度工作总结2015
2015/05/18 职场文书
2015年语文教师工作总结
2015/05/25 职场文书
入党积极分子考察意见
2015/06/02 职场文书
Pytorch GPU内存占用很高,但是利用率很低如何解决
2021/06/01 Python