在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实现拉钩网上的FizzBuzzWhizz问题示例
May 05 Python
python实现的文件夹清理程序分享
Nov 22 Python
在Linux下调试Python代码的各种方法
Apr 17 Python
用virtualenv建立多个Python独立虚拟开发环境
Jul 06 Python
利用Python+Java调用Shell脚本时的死锁陷阱详解
Jan 24 Python
使用memory_profiler监测python代码运行时内存消耗方法
Dec 03 Python
Python图像滤波处理操作示例【基于ImageFilter类】
Jan 03 Python
浅谈Python中函数的定义及其调用方法
Jul 19 Python
使用Python刷淘宝喵币(低阶入门版)
Oct 30 Python
Pytorch之Tensor和Numpy之间的转换的实现方法
Sep 03 Python
python上下文管理器异常问题解决方法
Feb 07 Python
Python异常类型以及处理方法汇总
Jun 05 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
文件系统基本操作类
2006/11/23 PHP
php中DOMElement操作xml文档实例演示
2013/03/26 PHP
一个比较不错的PHP日历类分享
2014/11/18 PHP
zend framework重定向方法小结
2016/05/28 PHP
PHP利用超级全局变量$_GET来接收表单数据的实例
2016/11/05 PHP
php 删除一维数组中某一个值元素的操作方法
2018/02/01 PHP
一个js拖拽的效果类和dom-drag.js浅析
2010/07/17 Javascript
JS事件Event元素(兼容IE,Firefox,Chorme)
2012/11/01 Javascript
javascript 全选与全取消功能的实现代码
2012/12/23 Javascript
ExtJS中文乱码之GBK格式编码解决方案及代码
2013/01/20 Javascript
JavaScript实现LI列表数据绑定的方法
2015/08/04 Javascript
js鼠标单击和双击事件冲突问题的快速解决方法
2016/07/11 Javascript
Vue组件之自定义事件的功能图解
2018/02/01 Javascript
vue 基于element-ui 分页组件封装的实例代码
2018/12/10 Javascript
jquery中为什么能用$操作
2019/06/18 jQuery
三剑客:offset、client和scroll还傻傻分不清?
2020/12/04 Javascript
python通过floor函数舍弃小数位的方法
2015/03/17 Python
使用python爬取B站千万级数据
2018/06/08 Python
Python用于学习重要算法的模块pygorithm实例浅析
2018/08/16 Python
python 含子图的gif生成时内存溢出的方法
2019/07/07 Python
Python Django 命名空间模式的实现
2019/08/09 Python
Python实现图片添加文字
2019/11/26 Python
python如何将图片转换素描画
2020/09/08 Python
html5 canvas实现跟随鼠标旋转的箭头
2016/03/11 HTML / CSS
Theory美国官网:后现代都市风时装品牌
2018/05/09 全球购物
iPad和Surface Pro蓝牙键盘:Brydge
2018/11/10 全球购物
工作中个人的自我评价
2013/12/31 职场文书
护理专科毕业生自荐书范文
2014/02/19 职场文书
陈欧的广告词
2014/03/18 职场文书
就业推荐表自我鉴定
2014/03/21 职场文书
党组织公开承诺书
2014/03/29 职场文书
党的群众路线教育实践活动个人对照检查材料范文
2014/09/25 职场文书
依法行政工作汇报材料
2014/10/28 职场文书
2014年护士工作总结范文
2014/11/11 职场文书
入党培养人考察意见
2015/06/08 职场文书
职工宿舍管理制度
2015/08/05 职场文书