在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 23 Python
Python实现简单网页图片抓取完整代码实例
Dec 15 Python
Python实现霍夫圆和椭圆变换代码详解
Jan 12 Python
pandas 透视表中文字段排序方法
Nov 16 Python
Python 利用pydub库操作音频文件的方法
Jan 09 Python
利用python计算windows全盘文件md5值的脚本
Jul 27 Python
Django Aggregation聚合使用方法解析
Aug 01 Python
什么是Python中的顺序表
Jun 02 Python
Keras: model实现固定部分layer,训练部分layer操作
Jun 28 Python
Python实现像awk一样分割字符串
Sep 15 Python
浅谈anaconda python 版本对应关系
Oct 07 Python
如何用tempfile库创建python进程中的临时文件
Jan 28 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/12/06 PHP
php中有关合并某一字段键值相同的数组合并的改进
2015/03/10 PHP
php中Snoopy类用法实例
2015/06/19 PHP
php验证邮箱和ip地址最简单方法汇总
2015/10/30 PHP
实用javaScript技术-屏蔽类
2006/08/15 Javascript
Jquery中"$(document).ready(function(){ })"函数的使用详解
2013/12/30 Javascript
Javascript学习笔记之 函数篇(一) : 函数声明和函数表达式
2014/06/24 Javascript
Javascript类型转换的规则实例解析
2016/02/23 Javascript
浅谈js中test()函数在正则中的使用
2016/08/19 Javascript
javascript数组遍历的方法实例分析
2016/09/13 Javascript
JS 终止执行的实现方法
2016/11/24 Javascript
JS批量替换内容中关键词为超链接
2017/02/20 Javascript
基于vue.js实现侧边菜单栏
2017/03/20 Javascript
vue 过滤器filter实例详解
2018/03/14 Javascript
vue实现a标签点击高亮方法
2018/03/17 Javascript
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
2018/12/06 NodeJs
JavaScript使用Math.random()生成简单的验证码
2019/01/21 Javascript
JS双向链表实现与使用方法示例(增加一个previous属性实现)
2019/01/31 Javascript
记一次用vue做的活动页的方法步骤
2019/04/11 Javascript
Vue Elenent实现表格相同数据列合并
2020/11/30 Vue.js
[01:21]DOTA2周边文化主题展 神秘商店火热开售
2017/07/30 DOTA
python实现Adapter模式实例代码
2018/02/09 Python
OpenCV-Python 摄像头实时检测人脸代码实例
2019/04/30 Python
python 3.6.7实现端口扫描器
2019/09/04 Python
python实现的发邮件功能示例
2019/09/11 Python
python实现TCP文件传输
2020/03/20 Python
理解Django 中Call Stack机制的小Demo
2020/09/01 Python
如何在网站上添加谷歌定位信息
2016/04/16 HTML / CSS
英国在线珠宝店:The Jewel Hut
2017/03/20 全球购物
某公司的.net工程师面试题笔试题
2013/11/22 面试题
《在山的那边》教学反思
2014/02/23 职场文书
祖国在我心中演讲稿450字
2014/09/05 职场文书
担保书范本
2015/01/20 职场文书
2015年车间管理工作总结
2015/07/23 职场文书
计算机实训心得体会
2016/01/14 职场文书
JavaScript中的LHS和RHS分析详情
2022/04/06 Javascript