在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解释执行原理分析
Aug 22 Python
Windows系统下多版本pip的共存问题详解
Oct 10 Python
[原创]教女朋友学Python(一)运行环境搭建
Nov 29 Python
Python基于列表模拟堆栈和队列功能示例
Jan 05 Python
浅谈Python中的私有变量
Feb 28 Python
基于python requests库中的代理实例讲解
May 07 Python
python ftp 按目录结构上传下载的实现代码
Sep 12 Python
python向字符串中添加元素的实例方法
Jun 28 Python
Python3 chardet模块查看编码格式的例子
Aug 14 Python
pandas分批读取大数据集教程
Jun 06 Python
详解Python中Pyyaml模块的使用
Oct 08 Python
Python descriptor(描述符)的实现
Nov 15 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/11/26 PHP
Zend Guard一些常见问题解答
2008/09/11 PHP
PHP文件上传之多文件上传的实现思路
2016/01/27 PHP
php htmlentities()函数的定义和用法
2016/05/13 PHP
可以显示单图片,多图片ajax请求的ThickBox3.1类下载
2007/12/23 Javascript
javascript options属性集合操作代码
2009/12/28 Javascript
关于jquery中全局函数each使用介绍
2013/12/10 Javascript
JavaScript实现的简单幂函数实例
2015/04/17 Javascript
Javascript实现代码折叠功能
2016/08/25 Javascript
JS数组排序方法实例分析
2016/12/16 Javascript
JS对象创建的几种方式整理
2017/02/28 Javascript
Node.js中看JavaScript的引用
2017/04/22 Javascript
Angular.js中上传指令ng-upload的基本使用教程
2017/07/30 Javascript
layui-table对返回的数据进行转变显示的实例
2019/09/04 Javascript
详解微信小程序之提高应用速度小技巧
2020/01/07 Javascript
详解webpack的文件监听实现(热更新)
2020/09/11 Javascript
[04:29]2016国际邀请赛中国区预选赛Ehome战队教练采访
2016/06/27 DOTA
Python函数式编程指南(三):迭代器详解
2015/06/24 Python
Python实现爬取需要登录的网站完整示例
2017/08/19 Python
TensorFlow实现创建分类器
2018/02/06 Python
python在每个字符后添加空格的实例
2018/05/07 Python
python+selenium 定位到元素,无法点击的解决方法
2019/01/30 Python
通过代码实例解析Pytest运行流程
2020/08/20 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
2020/11/13 Python
BONIA官方网站:国际奢侈品牌和皮革专家
2016/11/27 全球购物
施华洛世奇意大利官网:SWAROVSKI意大利
2018/07/23 全球购物
德国净水壶和滤芯品牌:波尔德PearlCo(家用净水器)
2020/04/29 全球购物
WSDL的操作类型主要有几种
2013/07/19 面试题
社区矫正工作方案
2014/06/04 职场文书
劳动竞赛口号
2014/06/16 职场文书
银行竞聘上岗演讲稿
2014/09/12 职场文书
保险内勤岗位职责
2015/04/13 职场文书
《生物入侵者》教学反思
2016/02/16 职场文书
世界文化遗产导游词
2019/08/07 职场文书
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
2021/05/21 Redis
pytorch 梯度NAN异常值的解决方案
2021/06/05 Python