在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 24 Python
python字典基本操作实例分析
Jul 11 Python
python生成式的send()方法(详解)
May 08 Python
python 寻找优化使成本函数最小的最优解的方法
Dec 28 Python
python互斥锁、加锁、同步机制、异步通信知识总结
Feb 11 Python
Python实现DDos攻击实例详解
Feb 02 Python
python实现屏保程序(适用于背单词)
Jul 30 Python
Python实现性能自动化测试竟然如此简单
Jul 30 Python
深度学习入门之Pytorch 数据增强的实现
Feb 26 Python
Python脚本如何在bilibili中查找弹幕发送者
Jun 04 Python
详解python实现可视化的MD5、sha256哈希加密小工具
Sep 14 Python
python爬虫 requests-html的使用
Nov 30 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
9个PHP开发常用功能函数小结
2011/07/15 PHP
php5.3 不支持 session_register() 此函数已启用的解决方法
2013/11/12 PHP
Win2003+apache+PHP+SqlServer2008 配置生产环境
2014/07/29 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
2017/12/21 PHP
关于IFRAME 自适应高度的研究
2006/07/20 Javascript
jQuery代码优化 选择符篇
2011/11/01 Javascript
js图片自动切换效果处理代码
2013/05/07 Javascript
ExtJS的拖拽效果示例
2013/12/09 Javascript
JS 数字转换研究总结
2013/12/26 Javascript
如何让浏览器支持jquery ajax load 前进、后退功能
2014/06/12 Javascript
javascript之Array 数组对象详解
2016/06/07 Javascript
js实现为a标签添加事件的方法(使用闭包循环)
2016/08/02 Javascript
AngularJS入门教程之静态模板详解
2016/08/18 Javascript
微信小程序 中wx.chooseAddress(OBJECT)实例详解
2017/03/31 Javascript
Angular中$state.go页面跳转并传递参数的方法
2017/05/09 Javascript
iscroll.js滚动加载实例详解
2017/07/18 Javascript
vue页面引入three.js实现3d动画场景操作
2020/08/10 Javascript
JS如何判断对象是否包含某个属性
2020/08/29 Javascript
python基础教程之基本内置数据类型介绍
2014/02/20 Python
跟老齐学Python之类的细节
2014/10/13 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
2017/12/03 Python
用TensorFlow实现多类支持向量机的示例代码
2018/04/28 Python
python字典setdefault方法和get方法使用实例
2019/12/25 Python
Python使用Pandas库常见操作详解
2020/01/16 Python
对Keras中predict()方法和predict_classes()方法的区别说明
2020/06/09 Python
美国著名的婴儿学步鞋老品牌:Robeez
2016/08/20 全球购物
Alba Moda德国网上商店:意大利时尚女装销售
2016/11/14 全球购物
十岁生日家长答谢词
2014/01/17 职场文书
农民致富事迹材料
2014/01/23 职场文书
党员活动日总结
2014/05/05 职场文书
团代会宣传工作方案
2014/05/08 职场文书
党员对十八届四中全会的期盼思想汇报范文
2014/10/17 职场文书
学生违反校规检讨书
2014/10/28 职场文书
社区禁毒宣传活动总结
2015/05/07 职场文书
同步小康驻村工作简报
2015/07/20 职场文书
Redis数据同步之redis shake的实现方法
2022/04/21 Redis