在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实现比较扑克牌大小程序代码示例
Dec 06 Python
Django 浅谈根据配置生成SQL语句的问题
May 29 Python
Sanic框架流式传输操作示例
Jul 18 Python
python实现dijkstra最短路由算法
Jan 17 Python
用uWSGI和Nginx部署Flask项目的方法示例
May 05 Python
Python控制Firefox方法总结
Jun 03 Python
Flask-WTF表单的使用方法
Jul 12 Python
关于Python核心框架tornado的异步协程的2种方法详解
Aug 28 Python
详解python 降级到3.6终极解决方案
Feb 06 Python
python实现程序重启和系统重启方式
Apr 16 Python
如何用python反转图片,视频
Apr 24 Python
Python 统计序列中元素的出现频度
Apr 26 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 特殊字符处理函数
2008/09/05 PHP
php时区转换转换函数
2014/01/07 PHP
使用php记录用户通过搜索引擎进网站的关键词
2014/02/13 PHP
CI框架(ajax分页,全选,反选,不选,批量删除)完整代码详解
2016/11/01 PHP
浅谈PHP匿名函数和闭包
2019/03/08 PHP
JS日历 推荐
2006/12/03 Javascript
jquery实现居中弹出层代码
2010/08/25 Javascript
网页中CDATA标记的说明
2010/09/12 Javascript
js querySelector和getElementById通过id获取元素的区别
2012/04/20 Javascript
document.documentElement的一些使用技巧
2013/04/18 Javascript
JQuery的Ajax跨域请求原理概述及实例
2013/04/26 Javascript
node.js中的fs.fchmod方法使用说明
2014/12/16 Javascript
javascript实现Table间隔色以及选择高亮(和动态切换数据)的方法
2015/05/14 Javascript
基于JS判断iframe是否加载成功的方法(多种浏览器)
2016/05/13 Javascript
bootstrap table分页模板和获取表中的ID方法
2017/01/10 Javascript
详解使用angular-cli发布i18n多国语言Angular应用
2017/05/20 Javascript
JS实现弹出下载对话框及常见文件类型的下载
2017/07/13 Javascript
关于JavaScript中forEach和each用法浅析
2017/07/27 Javascript
详解在vue-cli中引用jQuery、bootstrap以及使用sass、less编写css
2017/11/08 jQuery
Node.js利用console输出日志文件的方法示例
2018/04/27 Javascript
Android 自定义view仿微信相机单击拍照长按录视频按钮
2019/07/19 Javascript
python中使用urllib2获取http请求状态码的代码例子
2014/07/07 Python
Python使用Flask框架获取当前查询参数的方法
2015/03/21 Python
Python正则表达式使用范例分享
2016/12/04 Python
利用python获取某年中每个月的第一天和最后一天
2016/12/15 Python
Python 处理数据的实例详解
2017/08/10 Python
解决pandas中读取中文名称的csv文件报错的问题
2018/07/04 Python
使用Python实现从各个子文件夹中复制指定文件的方法
2018/10/25 Python
解决python3中cv2读取中文路径的问题
2018/12/05 Python
Python零基础入门学习之输入与输出
2019/04/03 Python
CSS3 3D旋转rotate效果实例介绍
2016/05/03 HTML / CSS
医疗保健专业人士购物网站:Scrubs & Beyond
2017/02/08 全球购物
Optimalprint加拿大:在线打印服务
2020/04/03 全球购物
鉴定评语大全
2014/05/05 职场文书
教师反腐倡廉演讲稿
2014/09/03 职场文书
关于企业的执行力标语大全
2020/01/06 职场文书