解决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中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
Mar 12 Python
Python常见异常分类与处理方法
Jun 04 Python
python实现冒泡排序算法的两种方法
Mar 10 Python
详解关于Django中ORM数据库迁移的配置
Oct 08 Python
详解分布式任务队列Celery使用说明
Nov 29 Python
Pytorch中的variable, tensor与numpy相互转化的方法
Oct 10 Python
利用matplotlib实现根据实时数据动态更新图形
Dec 13 Python
tensorflow使用指定gpu的方法
Feb 04 Python
keras分类模型中的输入数据与标签的维度实例
Jul 03 Python
python opencv pytesseract 验证码识别的实现
Aug 28 Python
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
Apr 27 Python
python 详解turtle画爱心代码
Feb 15 Python
用Python实现Newton插值法
Apr 17 #Python
Python+Appium新手教程
Pytest之测试命名规则的使用
Apr 16 #Python
pycharm debug 断点调试心得分享
Python通过m3u8文件下载合并ts视频的操作
Python实现Telnet自动连接检测密码的示例
AI:如何训练机器学习的模型
You might like
PHP XML操作的各种方法解析(比较详细)
2010/06/17 PHP
PHP中PDO的错误处理
2011/09/04 PHP
Symfony2安装的方法(2种方法)
2016/02/04 PHP
PHP函数rtrim()使用中的怪异现象分析
2017/02/24 PHP
IE iframe的onload方法分析小结
2010/01/07 Javascript
匹配任意字符的正则表达式写法
2010/04/29 Javascript
JavaScript自定义DateDiff函数(兼容所有浏览器)
2012/03/01 Javascript
JavaScript设计模式经典之命令模式
2016/02/24 Javascript
jquery if条件语句的写法
2016/05/19 Javascript
Vue.js中轻松解决v-for执行出错的三个方案
2017/06/09 Javascript
js实现省市级联效果分享
2017/08/10 Javascript
详解从Vue.js源码看异步更新DOM策略及nextTick
2017/10/11 Javascript
微信小程序组件之srcoll-view的详解
2017/10/19 Javascript
JavaScript引用类型之基本包装类型实例分析【Boolean、Number和String】
2018/08/09 Javascript
cdn模式下vue的基本用法详解
2018/10/07 Javascript
VUE脚手架具体使用方法
2019/05/20 Javascript
原生JS实现列表内容自动向上滚动效果
2019/05/22 Javascript
[02:51]DOTA2 2015国际邀请赛中国区预选赛第一日战报
2015/05/27 DOTA
Python的动态重新封装的教程
2015/04/11 Python
python生成器generator用法实例分析
2015/06/04 Python
Python中生成Epoch的方法
2017/04/26 Python
python修改txt文件中的某一项方法
2018/12/29 Python
keras导入weights方式
2020/06/12 Python
python如何导入依赖包
2020/07/13 Python
css3个性化字体_动力节点Java学院整理
2017/07/12 HTML / CSS
css3中background新增的4个新的相关属性用法介绍
2013/09/26 HTML / CSS
使用css3和jquery实现可伸缩搜索框
2014/02/12 HTML / CSS
时尚孕妇装:Ingrid & Isabel
2019/05/08 全球购物
威盛公司软件C++工程师笔试题面试题
2012/07/16 面试题
计算机专业毕业生推荐信
2013/11/25 职场文书
教师应聘个人求职信
2013/12/10 职场文书
外企求职信范文分享
2013/12/31 职场文书
中文专业学生自我评价范文
2014/02/06 职场文书
校外活动方案
2014/08/28 职场文书
机关单位2016年创先争优活动总结
2016/04/05 职场文书
餐厅如何利用“营销策略”扭转亏本局面
2019/10/15 职场文书