在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理


Posted in Python onApril 14, 2022

1. 引言

深拷贝和浅拷贝是Python中重要的概念,本文重点介绍在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理。

闲话少说,我们直接开始吧!

2. 浅拷贝

2.1 问题引入

我们来举个栗子,如下所示我们有两个数组a和b,样例代码如下:

import numpy as np

a = np.array([1, 2, 3])
b = a

print('a =', a)
print('b =', b)

输出如下:

a = [1 2 3]
b = [1 2 3]

此时如果我们对数组a做如下改变,代码如下:

import numpy as np

a = np.array([1, 2, 3])
b = a

a [0] = 42

print('a =', a)
print('b =', b)

那么我们的问题为: 此时b的值应该为多少?

运行上述代码后,我们得到输出如下:

a = [42 2 3]
b = [42 2 3]

2.2 问题剖析

也许有人会觉得输出应该为a=[42 2 3] 和 b=[1 2 3] ,但是运行上述代码后我们发现a和b的值均发生了相应的改变。这主要是由于在Numpy中对变量的赋值操作,实际上发生的为浅拷贝。

换句话说,此时两个变量指向同一块内存地址,如下所示:

在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理

所以,此时如果我们修改数组original_array中的某个元素,copy_array 由于和original_array公用同一块内存,所以其中的元素也会发生相应的变化。

3. 深拷贝

3.1 举个栗子

如果我们想要对Numpy数组执行深拷贝,此时我们可以使用函数copy()。相关的样例代码如下:

import numpy as np

a = np.array([1, 2, 3])
b = a.copy()

print('a =', a)
print('b =', b)

输出如下:

a = [1 2 3]
b = [1 2 3]

此时,如果我们改变数组a中的元素,代码如下:

import numpy as np

a = np.array([1, 2, 3])
b = a.copy()

a [0] = 42

print('a =', a)
print('b =', b)

此时的代码输出如下:

a = [42 2 3]
b = [1 2 3]

3.2 探究原因

观察上述输出,我们可以清楚地看到数组a发生了改变而数组b没有发生变化,这是由于我们使用了深拷贝。此时的内存地址如下:

在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理

由于 original_array和copy_array指向不同的内存地址空间,所以此时我们对original_array的改变并不会对copy_array带来影响。

4. 技巧总结

经过上述对深拷贝和浅拷贝的举例和示例,相信大家都已有了清晰的认识,接着我们对上述知识点进行总结,归纳如下:

4.1 判断是否指向同一内存

如果我们需要知道两个变量是否指向同一块内存地址,我们可以方便地使用is操作。

浅拷贝示例:

a = np.array([1, 2, 3])
b = a
print(b is a)

输出如下:

True

深拷贝示例:

a = np.array([1, 2, 3])
b = a.copy()
print(b is a)

输出如下:

False

4.2 其他数据类型

尽管本文中所有的示例都使用了NumPy数组,但本文中所涉及的知识也适用于Python中的列表和字典等其他数据类型。

总之,我们需要时刻记载心中:在浅拷贝中,原始数组和新的数组共同执行同一块内存;同时在深拷贝中,新的数组是原始数据的单独的拷贝,它指向一块新的内存地址。

5. 总结

本文重点介绍了Python中对Numpy数组操作的浅拷贝和深拷贝的概念和背后的原理,同时给出了相应的代码示例。

到此这篇关于一文带你搞懂Numpy中的深拷贝和浅拷贝的文章就介绍到这了!

Python 相关文章推荐
python对指定目录下文件进行批量重命名的方法
Apr 18 Python
玩转python爬虫之URLError异常处理
Feb 17 Python
教你使用python画一朵花送女朋友
Mar 29 Python
python实现推箱子游戏
Mar 25 Python
pycharm运行和调试不显示结果的解决方法
Nov 30 Python
Python 获取div标签中的文字实例
Dec 20 Python
详解Python爬取并下载《电影天堂》3千多部电影
Apr 26 Python
python面试题Python2.x和Python3.x的区别
May 28 Python
详解Python是如何实现issubclass的
Jul 24 Python
Python中的xlrd模块使用原理解析
May 21 Python
matplotlib grid()设置网格线外观的实现
Feb 22 Python
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
Apr 14 #Python
Python中time标准库的使用教程
Apr 13 #Python
Python函数对象与闭包函数
Apr 13 #Python
Python作用域和名称空间的详细介绍
Apr 13 #Python
Python获取字典中某个key的value
Apr 13 #Python
Python基本的内置数据类型及使用方法
Apr 13 #Python
Python如何使用循环结构和分支结构
Apr 13 #Python
You might like
汉字转化为拼音(php版)
2006/10/09 PHP
PHP采集腾讯微博的实现代码
2012/01/19 PHP
php网上商城购物车设计代码分享
2012/02/15 PHP
php中使用sftp教程
2015/03/30 PHP
php.ini中的request_order推荐设置
2015/05/10 PHP
一个很酷的拖动层的js类,兼容IE及Firefox
2009/06/23 Javascript
jQuery中对未来的元素绑定事件用bind、live or on
2014/04/17 Javascript
js实现使用鼠标拖拽切换图片的方法
2015/05/04 Javascript
Bootstrap每天必学之导航组件
2016/04/25 Javascript
使用JS在浏览器中判断当前网络连接状态的几种方法
2017/05/05 Javascript
antd-mobile ListView长列表的数据更新遇到的坑
2020/04/08 Javascript
vue实现购物车的监听
2020/04/20 Javascript
[00:35]可解锁地面特效
2018/12/20 DOTA
python中Pycharm 输出中文或打印中文乱码现象的解决办法
2017/06/16 Python
Python加密方法小结【md5,base64,sha1】
2017/07/13 Python
python利用Tesseract识别验证码的方法示例
2019/01/21 Python
对python判断是否回文数的实例详解
2019/02/08 Python
快速解决pyqt5窗体关闭后子线程不同时退出的问题
2019/06/19 Python
Python 点击指定位置验证码破解的实现代码
2019/09/11 Python
使用keras实现densenet和Xception的模型融合
2020/05/23 Python
python的数学算法函数及公式用法
2020/11/18 Python
说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法
2012/05/24 面试题
高级Java程序员面试要点
2013/08/02 面试题
计算机专业自我鉴定
2013/10/15 职场文书
师范院校学生自荐信范文
2013/12/27 职场文书
设计师个人求职信范文
2014/02/02 职场文书
《荷花》教学反思
2014/04/16 职场文书
2014年学生会工作总结范文
2014/11/07 职场文书
2016大学自主招生推荐信范文
2015/03/23 职场文书
消防隐患整改通知书
2015/04/22 职场文书
学生犯错保证书
2015/05/09 职场文书
生鲜超市—未来中国最具有潜力零售业态
2019/08/02 职场文书
goland 清除所有的默认设置操作
2021/04/28 Golang
MySql 缓存查询原理与缓存监控和索引监控介绍
2021/07/02 MySQL
MySQL中正则表达式(REGEXP)使用详解
2022/07/07 MySQL
基于Android10渲染Surface的创建过程
2022/08/14 Java/Android