在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贪吃蛇游戏编写代码
Oct 26 Python
python输入错误密码用户锁定实现方法
Nov 27 Python
浅谈Python实现Apriori算法介绍
Dec 20 Python
如何在Django中添加没有微秒的 DateTimeField 属性详解
Jan 30 Python
Python基于BeautifulSoup和requests实现的爬虫功能示例
Aug 02 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
Aug 27 Python
django 取消csrf限制的实例
Mar 13 Python
python读取配置文件方式(ini、yaml、xml)
Apr 09 Python
解决python虚拟环境切换无效的问题
Apr 30 Python
基于Python正确读取资源文件
Sep 14 Python
Python创建简单的神经网络实例讲解
Jan 04 Python
python3 kubernetes api的使用示例
Jan 12 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环境无法上传文件的解决方法
2014/04/30 PHP
PHP与MYSQL中UTF8编码的中文排序实例
2014/10/21 PHP
PHP登录验证码的实现与使用方法
2016/07/07 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
2017/08/30 PHP
PHP正则匹配到2个字符串之间的内容方法
2018/12/24 PHP
jquery tools 系列 scrollable(2)
2009/09/06 Javascript
JS与框架页的操作代码
2010/01/17 Javascript
原生js事件的添加和删除的封装
2014/07/01 Javascript
node.js中的buffer.toJSON方法使用说明
2014/12/14 Javascript
jQuery源码解读之removeAttr()方法分析
2015/02/20 Javascript
一览画面点击复选框后获取多个id值的方法
2016/05/30 Javascript
canvas学习之API整理笔记(二)
2016/12/29 Javascript
EasyUI学习之DataGird分页显示数据
2016/12/29 Javascript
js脚本编写简单刷票投票系统
2017/06/27 Javascript
Angular2仿照微信UI实现9张图片上传和预览的示例代码
2017/10/19 Javascript
Node.JS循环删除非空文件夹及子目录下的所有文件
2018/03/12 Javascript
你不知道的SpringBoot与Vue部署解决方案
2020/11/09 Javascript
[42:50]NB vs VP 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python实现批量转换文件编码(批转换编码示例)
2014/01/23 Python
深入解析Python的Tornado框架中内置的模板引擎
2016/07/11 Python
开源软件包和环境管理系统Anaconda的安装使用
2017/09/04 Python
python语音识别实践之百度语音API
2018/08/30 Python
Python操作配置文件ini的三种方法讲解
2019/02/22 Python
浅谈Python type的使用
2019/11/19 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
2020/07/14 Python
Python 数据的累加与统计的示例代码
2020/08/03 Python
Selenium alert 弹窗处理的示例代码
2020/08/06 Python
Mio Skincare中文官网:肌肤和身体护理
2016/10/26 全球购物
Otel.com:折扣酒店预订
2017/08/24 全球购物
SOA面试题:如何在SOA中实现松耦合
2013/07/21 面试题
吨的认识教学反思
2014/04/27 职场文书
幼儿园园长新年寄语2015
2014/12/08 职场文书
初中信息技术教学计划
2015/01/22 职场文书
《世界多美呀》教学反思
2016/02/22 职场文书
python基础之文件处理知识总结
2021/05/23 Python