解决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 14 Python
使用Python程序抓取新浪在国内的所有IP的教程
May 04 Python
一个可以套路别人的python小程序实例代码
Apr 09 Python
python面试题Python2.x和Python3.x的区别
May 28 Python
pandas DataFrame索引行列的实现
Jun 04 Python
python+logging+yaml实现日志分割
Jul 22 Python
python 动态调用函数实例解析
Oct 21 Python
python GUI框架pyqt5 对图片进行流式布局的方法(瀑布流flowlayout)
Mar 12 Python
Python faker生成器生成虚拟数据代码实例
Jul 20 Python
Python爬虫入门教程01之爬取豆瓣Top电影
Jan 24 Python
对Pytorch 中的contiguous理解说明
Mar 03 Python
Python趣味挑战之给幼儿园弟弟生成1000道算术题
May 28 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 星际争霸
php 数组的合并、拆分、区别取值函数集
2010/02/15 PHP
整理的9个实用的PHP库简介和下载
2010/11/09 PHP
PHP新建类问题分析及解决思路
2015/11/19 PHP
php PDO判断连接是否可用的实现方法
2017/04/03 PHP
PHP简单获取随机数的常用方法小结
2017/06/07 PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
2019/03/12 PHP
ajax 文件上传应用简单实现
2009/03/03 Javascript
javascript 打印页面代码
2009/03/24 Javascript
JQuery CSS样式控制 学习笔记
2009/07/23 Javascript
Javascript异步编程的4种方法让你写出更出色的程序
2013/01/17 Javascript
原生javascript兼容性测试实例
2013/07/01 Javascript
javascript判断chrome浏览器的方法
2014/03/26 Javascript
基于jquery实现的文字向上跑动类似跑马灯的效果
2014/06/17 Javascript
JavaScript文本框脚本编写的注意事项
2016/01/25 Javascript
由简入繁实现Jquery树状结构的方法(推荐)
2016/06/10 Javascript
JavaScript正则表达式替换字符串中图片地址(img src)的方法
2017/01/13 Javascript
Angular.js指令学习中一些重要属性的用法教程
2017/05/24 Javascript
AngularJS 验证码60秒倒计时功能的实现
2017/06/05 Javascript
浅析JavaScript中的平稳退化(graceful degradation)
2017/07/24 Javascript
vue-router路由模式详解(小结)
2019/08/26 Javascript
vue router-link 默认a标签去除下划线的实现
2020/11/06 Javascript
django中send_mail功能实现详解
2018/02/06 Python
Python Web框架之Django框架Model基础详解
2019/08/16 Python
python利用openpyxl拆分多个工作表的工作簿的方法
2019/09/27 Python
Python+OpenCV实现将图像转换为二进制格式
2020/01/09 Python
TensorBoard 计算图的查看方式
2020/02/15 Python
python中如何使用虚拟环境
2020/10/14 Python
socket.io 和canvas 实现的共享画板功能
2019/05/22 HTML / CSS
试述DBMS的主要功能
2016/11/13 面试题
毕业生求职简历中的自我评价
2013/10/18 职场文书
模范家庭事迹材料
2014/02/10 职场文书
关于读书的演讲稿
2014/05/07 职场文书
2014年机关作风建设工作总结
2014/10/23 职场文书
员工工作及收入证明
2014/10/28 职场文书
教育教学工作反思
2016/02/24 职场文书