在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实现简易Web爬虫详解
Jan 03 Python
python+flask实现API的方法
Nov 21 Python
python画柱状图--不同颜色并显示数值的方法
Dec 13 Python
Python3实现计算两个数组的交集算法示例
Apr 03 Python
PyQt5 对图片进行缩放的实例
Jun 18 Python
python 寻找离散序列极值点的方法
Jul 10 Python
在python Numpy中求向量和矩阵的范数实例
Aug 26 Python
Python 解决相对路径问题:"No such file or directory"
Jun 05 Python
Keras SGD 随机梯度下降优化器参数设置方式
Jun 19 Python
python如何对链表操作
Oct 10 Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
Nov 28 Python
Python可视化神器pyecharts之绘制箱形图
Jul 07 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编程最快明白》第三讲:php数组
2010/11/01 PHP
Youku 视频绝对地址获取的方法详解
2013/06/26 PHP
php批量删除超链接的实现方法
2015/10/19 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
2016/02/16 PHP
asp(javascript)全角半角转换代码 dbc2sbc
2009/08/06 Javascript
让Firefox支持event对象实现代码
2009/11/07 Javascript
js字母大小写转换实现方法总结
2013/11/13 Javascript
纯js模拟div层弹性运动的方法
2015/07/27 Javascript
浅析JavaScript回调函数应用
2016/05/22 Javascript
jQuery简单设置文本框回车事件的方法
2016/08/01 Javascript
JS去除重复并统计数量的实现方法
2016/12/15 Javascript
解决微信二次分享不显示摘要和图片的问题
2017/08/18 Javascript
原生JS实现手动轮播图效果实例代码
2018/11/22 Javascript
Angular8 Http拦截器简单使用教程
2019/08/20 Javascript
vue中nextTick用法实例
2019/09/11 Javascript
[02:38]DOTA2超级联赛专访Loda 认为IG世界最强
2013/05/27 DOTA
Python生成随机密码
2015/03/10 Python
实例讲解Python中函数的调用与定义
2016/03/14 Python
python通过pip更新所有已安装的包实现方法
2017/05/19 Python
python3+PyQt5实现自定义窗口部件Counters
2018/04/20 Python
浅谈python日志的配置文件路径问题
2018/04/28 Python
Python使用修饰器进行异常日志记录操作示例
2019/03/19 Python
django Layui界面点击弹出对话框并请求逻辑生成分页的动态表格实例
2020/05/12 Python
网络艺术零售业的先驱者:artrepublic
2017/09/26 全球购物
MADE荷兰:提供原创设计师家具
2018/04/03 全球购物
家得宝墨西哥官网:The Home Depot墨西哥
2019/11/18 全球购物
JAVA中运算符的分类及举例
2015/09/12 面试题
探矿工程师自荐信
2014/01/24 职场文书
高级编程求职信模板
2014/02/16 职场文书
暑期教师培训方案
2014/06/07 职场文书
国际经济贸易专业自荐信
2014/06/13 职场文书
2014高三学生考试作弊检讨书
2014/12/14 职场文书
保研导师推荐信
2015/03/25 职场文书
2015年大学生工作总结
2015/04/21 职场文书
教师节晚会主持词
2015/06/30 职场文书
Python编程中Python与GIL互斥锁关系作用分析
2021/09/15 Python