在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 ip正则式
May 07 Python
python实现搜索本地文件信息写入文件的方法
Feb 22 Python
python使用fcntl模块实现程序加锁功能示例
Jun 23 Python
python使用numpy读取、保存txt数据的实例
Oct 14 Python
Python中文编码知识点
Feb 18 Python
PyQt5 QListWidget选择多项并返回的实例
Jun 17 Python
OpenCV 模板匹配
Jul 10 Python
解决Python对齐文本字符串问题
Aug 28 Python
python递归函数用法详解
Oct 26 Python
关于python scrapy中添加cookie踩坑记录
Nov 17 Python
Python数据清洗工具之Numpy的基本操作
Apr 22 Python
python munch库的使用解析
May 25 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框架laravel的.env文件配置教程
2017/06/07 PHP
ext checkboxgroup 回填数据解决
2009/08/21 Javascript
jQuery实现的图片分组切换焦点图插件
2015/01/06 Javascript
2则自己编写的jQuery特效分享
2015/02/26 Javascript
基于Jquery代码实现支持PC端手机端幻灯片代码
2015/11/17 Javascript
jQuery倒计时代码(超简单)
2017/02/27 Javascript
JavaScript无缝滚动效果的实例代码
2017/03/27 Javascript
jQuery、layer实现弹出层的打开、关闭功能
2017/06/28 jQuery
js移动端图片压缩上传功能
2020/08/18 Javascript
vue全局组件与局部组件使用方法详解
2018/03/29 Javascript
在 Typescript 中使用可被复用的 Vue Mixin功能
2018/04/17 Javascript
灵活使用console让js调试更简单的方法步骤
2019/04/23 Javascript
JavaScript函数重载操作实例浅析
2020/05/02 Javascript
Vue过滤器,生命周期函数和vue-resource简单介绍
2021/01/12 Vue.js
[46:00]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第一局
2016/03/03 DOTA
python求斐波那契数列示例分享
2014/02/14 Python
从零学Python之引用和类属性的初步理解
2014/05/15 Python
Python写的Discuz7.2版faq.php注入漏洞工具
2014/08/06 Python
python递归删除指定目录及其所有内容的方法
2017/01/13 Python
pytorch中图像的数据格式实例
2020/02/11 Python
pytorch实现保证每次运行使用的随机数都相同
2020/02/20 Python
解决django中form表单设置action后无法回到原页面的问题
2020/03/13 Python
python Matplotlib基础--如何添加文本和标注
2021/01/26 Python
canvas生成带二维码海报的踩坑记录
2019/09/11 HTML / CSS
Html5自定义字体解决方法
2019/10/09 HTML / CSS
WoolOvers爱尔兰:羊绒、羊毛和棉针织品
2017/01/04 全球购物
大学生应聘推荐信范文
2013/11/19 职场文书
专业技术职务聘任书
2014/03/29 职场文书
工程材料采购方案
2014/05/18 职场文书
投标人法定代表人授权委托书格式
2014/09/28 职场文书
机关职员工作检讨书
2014/10/23 职场文书
教师教育教学随笔
2015/08/15 职场文书
Go语言特点及基本数据类型使用详解
2022/03/21 Golang
mysql insert 存在即不插入语法说明
2022/03/25 MySQL
避坑之 JavaScript 中的toFixed()和正则表达式
2022/04/19 Javascript