在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 xlrd读取excel日期类型的2种方法
Apr 28 Python
详解Django中的权限和组以及消息
Jul 23 Python
浅析Python中return和finally共同挖的坑
Aug 18 Python
Python实现时钟显示效果思路详解
Apr 11 Python
对pandas进行数据预处理的实例讲解
Apr 20 Python
便捷提取python导入包的属性方法
Oct 15 Python
python list格式数据excel导出方法
Oct 31 Python
Python 元组拆包示例(Tuple Unpacking)
Dec 24 Python
Python 面向对象部分知识点小结
Mar 09 Python
Python文件操作基础流程解析
Mar 19 Python
Python gevent协程切换实现详解
Sep 14 Python
python 实现波浪滤镜特效
Dec 02 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下删除字符串中HTML标签的函数
2008/08/27 PHP
php警告Creating default object from empty value 问题的解决方法
2014/04/02 PHP
PHP中使用sleep函数实现定时任务实例分享
2014/08/21 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
用javascript实现页面打印的三种方法
2007/03/05 Javascript
(jQuery,mootools,dojo)使用适合自己的编程别名命名
2010/09/14 Javascript
JS中attr和prop属性的区别以及优先选择示例介绍
2014/06/30 Javascript
JS自动倒计时30秒后按钮才可用(两种场景)
2015/08/31 Javascript
JavaScript驾驭网页-CSS与DOM
2016/03/24 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
2017/02/16 Javascript
jquery拼接ajax 的json和字符串拼接的方法
2017/03/11 Javascript
如何解决vue与传统jquery插件冲突
2017/03/20 Javascript
微信小程序之GET请求的实例详解
2017/09/29 Javascript
基于IView中on-change属性的使用详解
2018/03/15 Javascript
解决axios发送post请求返回400状态码的问题
2018/08/11 Javascript
手动下载Chrome并解决puppeteer无法使用问题
2018/11/12 Javascript
js通过循环多张图片实现动画效果
2019/12/19 Javascript
详解JavaScript类型判断的四种方法
2020/10/21 Javascript
[04:02]2014DOTA2国际邀请赛 BBC每日综述中国战队将再度登顶
2014/07/21 DOTA
安装python3的时候就是输入python3死活没有反应的解决方法
2018/01/24 Python
Python实现从log日志中提取ip的方法【正则提取】
2018/03/31 Python
python 通过xml获取测试节点和属性的实例
2018/03/31 Python
Windows下python3.7安装教程
2018/07/31 Python
Python操作配置文件ini的三种方法讲解
2019/02/22 Python
解决Django 在ForeignKey中出现 non-nullable field错误的问题
2019/08/06 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
2019/11/28 Python
nginx搭建基于python的web环境的实现步骤
2020/01/03 Python
css3 border旋转时的动画应用
2016/01/22 HTML / CSS
详解CSS3新增的背景属性
2019/12/25 HTML / CSS
阿里旅行:飞猪
2017/01/05 全球购物
教师演讲稿范文
2014/01/08 职场文书
菜篮子工程实施方案
2014/03/08 职场文书
安全生产标语
2014/06/06 职场文书
艺术节开幕词
2015/01/28 职场文书
为什么 Nginx 比 Apache 更牛逼
2021/03/31 Servers
springboot新建项目pom.xml文件第一行报错的解决
2022/01/18 Java/Android