解决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实现删除Android工程中的冗余字符串
Jan 19 Python
在Python中操作列表之List.pop()方法的使用
May 21 Python
Python实现截屏的函数
Jul 26 Python
浅谈Python中chr、unichr、ord字符函数之间的对比
Jun 16 Python
Python实现进程同步和通信的方法
Jan 02 Python
详解flask入门模板引擎
Jul 18 Python
在Python中增加和插入元素的示例
Nov 01 Python
Python 中导入csv数据的三种方法
Nov 01 Python
python获取微信小程序手机号并绑定遇到的坑
Nov 19 Python
python 常见字符串与函数的用法详解
Nov 23 Python
Django框架会话技术实例分析【Cookie与Session】
May 24 Python
Django框架之中间件MiddleWare的实现
Dec 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中上传大体积文件时需要的设置
2006/10/09 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
JavaScript For Beginners(转载)
2007/01/05 Javascript
JavaScript 函数惰性载入的实现及其优点介绍
2013/08/12 Javascript
jquery 追加tr和删除tr示例代码
2013/09/12 Javascript
js判断iframe内的网页是否滚动到底部触发事件
2014/03/18 Javascript
使用原生js写的一个简单slider
2014/04/29 Javascript
$("").click与onclick的区别示例介绍
2014/09/25 Javascript
使用JavaScript脚本无法直接改变Asp.net中Checkbox控件的Enable属性的解决方法
2015/09/16 Javascript
Vue声明式渲染详解
2017/05/17 Javascript
详解React-Native解决键盘遮挡问题(Keyboard遮挡问题)
2017/07/13 Javascript
手把手教你vue-cli单页到多页应用的方法
2018/05/31 Javascript
jquery拖拽自动排序插件使用方法详解
2020/07/20 jQuery
Python实现获取照片拍摄日期并重命名的方法
2017/09/30 Python
python实现微信跳一跳辅助工具步骤详解
2018/01/04 Python
Python内存读写操作示例
2018/07/18 Python
深入理解python中sort()与sorted()的区别
2018/08/29 Python
scrapy-redis源码分析之发送POST请求详解
2019/05/15 Python
pytorch 准备、训练和测试自己的图片数据的方法
2020/01/10 Python
Python随机数函数代码实例解析
2020/02/09 Python
Python图像处理库PIL的ImageDraw模块介绍详解
2020/02/26 Python
Python中三维坐标空间绘制的实现
2020/09/22 Python
GIVENCHY纪梵希官方旗舰店:高定彩妆与贵族护肤品
2018/04/16 全球购物
Groupon西班牙官方网站:在线优惠券和交易,节省高达70%
2021/03/13 全球购物
Linux文件系统类型
2012/02/15 面试题
JAVA程序员面试题
2012/10/03 面试题
汽车驾驶求职信
2013/10/25 职场文书
行政部工作岗位职责范本
2014/03/05 职场文书
《大作家的小老师》教学反思
2014/04/16 职场文书
科长竞争上岗演讲稿
2014/05/12 职场文书
财务工作疏忽检讨书
2014/09/11 职场文书
2014年向国旗敬礼活动总结
2014/09/27 职场文书
个人创业事迹材料
2014/12/30 职场文书
如何写辞职书
2015/02/26 职场文书
大学生志愿者心得体会
2016/01/15 职场文书
90行Python代码开发个人云盘应用
2021/04/20 Python