解决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的动态重新封装的教程
Apr 11 Python
python检测是文件还是目录的方法
Jul 03 Python
Python中动态检测编码chardet的使用教程
Jul 06 Python
virtualenv实现多个版本Python共存
Aug 21 Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
Nov 16 Python
python函数与方法的区别总结
Jun 23 Python
Python 脚本实现淘宝准点秒杀功能
Nov 13 Python
Python使用urllib模块对URL网址中的中文编码与解码实例详解
Feb 18 Python
Python之变量类型和if判断方式
May 05 Python
keras中的loss、optimizer、metrics用法
Jun 15 Python
pycharm进入时每次都是insert模式的解决方式
Feb 05 Python
Django 实现jwt认证的示例
Apr 30 Python
用Python实现Newton插值法
Apr 17 #Python
Python+Appium新手教程
Pytest之测试命名规则的使用
Apr 16 #Python
pycharm debug 断点调试心得分享
Python通过m3u8文件下载合并ts视频的操作
Python实现Telnet自动连接检测密码的示例
AI:如何训练机器学习的模型
You might like
Terran兵种对照表
2020/03/14 星际争霸
浅谈laravel 5.6 安装 windows上使用composer的安装过程
2019/10/18 PHP
javascript检查日期格式的函数[比较全]
2008/10/17 Javascript
Prototype PeriodicalExecuter对象 学习
2009/07/19 Javascript
3种Jquery限制文本框只能输入数字字母的方法
2014/12/03 Javascript
基于豆瓣API+Angular开发的web App
2015/01/02 Javascript
js实现文字跟随鼠标移动而移动的方法
2015/02/28 Javascript
在页面中输出当前客户端时间javascript实例代码
2016/03/02 Javascript
jquery心形点赞关注效果的简单实现
2016/11/14 Javascript
jQuery表格的维护和删除操作
2017/02/03 Javascript
js实现文本上下来回滚动
2017/02/03 Javascript
基于vue2的table分页组件实现方法
2017/03/20 Javascript
js学习总结_轮播图之渐隐渐现版(实例讲解)
2017/07/17 Javascript
JS实现电商商品展示放大镜特效
2020/01/07 Javascript
vue 自定指令生成uuid滚动监听达到tab表格吸顶效果的代码
2020/09/16 Javascript
详解阿里Node.js技术文档之process模块学习指南
2021/01/04 Javascript
python定向爬取淘宝商品价格
2018/02/27 Python
浅谈python日志的配置文件路径问题
2018/04/28 Python
python中的常量和变量代码详解
2018/07/25 Python
Python使用sax模块解析XML文件示例
2019/04/04 Python
python中open函数的基本用法示例
2019/09/07 Python
Python实现字符串中某个字母的替代功能
2019/10/21 Python
python 负数取模运算实例
2020/06/03 Python
解决导入django_filters不成功问题No module named 'django_filter'
2020/07/15 Python
CSS3 实现倒计时效果
2020/11/25 HTML / CSS
详解canvas多边形(蜘蛛图)的画法示例
2018/01/29 HTML / CSS
世界上最大的汽车共享网站:Zipcar
2017/01/14 全球购物
英国领先的野生鸟类食品供应商:GardenBird
2018/08/09 全球购物
工程专业毕业生自荐信范文
2013/12/25 职场文书
化工操作工岗位职责
2014/04/29 职场文书
妈妈活动方案
2014/08/15 职场文书
村安全生产责任书
2014/08/25 职场文书
远程培训的心得体会
2014/09/01 职场文书
2014年企业党建工作总结
2014/12/18 职场文书
Python 如何解决稀疏矩阵运算
2021/05/26 Python
pycharm部署django项目到云服务器的详细流程
2021/06/29 Python