解决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基础教程之五种数据类型详解
Jan 12 Python
Python使用正则表达式过滤或替换HTML标签的方法详解
Sep 25 Python
python excel使用xlutils类库实现追加写功能的方法
May 02 Python
pandas 转换成行列表进行读取与Nan处理的方法
Oct 30 Python
在Pycharm中修改文件默认打开方式的方法
Jan 17 Python
python去重,一个由dict组成的list的去重示例
Jan 21 Python
使用python3构建文件传输的方法
Feb 13 Python
python的pstuil模块使用方法总结
Jul 26 Python
pygame实现贪吃蛇游戏(上)
Oct 29 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
Nov 29 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
Dec 19 Python
python matplotlib绘制三维图的示例
Sep 24 Python
用Python实现Newton插值法
Apr 17 #Python
Python+Appium新手教程
Pytest之测试命名规则的使用
Apr 16 #Python
pycharm debug 断点调试心得分享
Python通过m3u8文件下载合并ts视频的操作
Python实现Telnet自动连接检测密码的示例
AI:如何训练机器学习的模型
You might like
全国FM电台频率大全 - 1 北京市
2020/03/11 无线电
php函数array_merge用法一例(合并同类数组)
2013/02/03 PHP
php利用cookies实现购物车的方法
2014/12/10 PHP
php5.x禁用eval的操作方法
2018/10/19 PHP
javaScript如何生成xmlhttp
2013/12/16 Javascript
jQuery实现点击小图显示大图代码分享
2015/08/25 Javascript
JS表单验证方法实例小结【电话、身份证号、Email、中文、特殊字符、身份证号等】
2017/02/14 Javascript
js正则表达式验证表单【完整版】
2017/03/06 Javascript
TypeScript入门-基本数据类型
2017/03/28 Javascript
详解Node中导入模块require和import的区别
2017/08/11 Javascript
Bootstrap图片轮播效果详解
2017/10/17 Javascript
layUI实现列表查询功能
2019/07/27 Javascript
vuejs中父子组件之间通信方法实例详解
2020/01/17 Javascript
Vue.js的模板语法详解
2020/02/16 Javascript
深入浅析JavaScript中的in关键字和for-in循环
2020/04/20 Javascript
vue实现移动端H5数字键盘组件使用详解
2020/08/25 Javascript
ant-design-vue中tree增删改的操作方法
2020/11/03 Javascript
JavaScript实现跟随鼠标移动的盒子
2021/01/28 Javascript
快速入门python学习笔记
2017/12/06 Python
python实现比较文件内容异同
2018/06/22 Python
Python绘制的二项分布概率图示例
2018/08/22 Python
如何使用Python自动控制windows桌面
2019/07/11 Python
python selenium爬取斗鱼所有直播房间信息过程详解
2019/08/09 Python
深入浅析python 中的self和cls的区别
2020/06/20 Python
python 实现aes256加密
2020/11/27 Python
Ubuntu20下的Django安装的方法步骤
2021/01/24 Python
收银员的岗位职责范本
2014/02/04 职场文书
司仪主持词两篇
2014/03/22 职场文书
保健品市场营销方案
2014/03/31 职场文书
2014年部门工作总结
2014/11/12 职场文书
Oracle 死锁的检测查询及处理
2021/09/25 Oracle
使用canvas仿Echarts实现金字塔图的实例代码
2021/11/11 HTML / CSS
python周期任务调度工具Schedule使用详解
2021/11/23 Python
我去timi了,一起去timi是什么意思?
2022/04/13 杂记
Mysql开启外网访问
2022/05/15 MySQL
解决spring.thymeleaf.cache=false不起作用的问题
2022/06/10 Java/Android