在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 相关文章推荐
简介Django中内置的一些中间件
Jul 24 Python
Zabbix实现微信报警功能
Oct 09 Python
Python遍历某目录下的所有文件夹与文件路径
Mar 15 Python
在Pycharm中设置默认自动换行的方法
Jan 16 Python
详解Python中的内建函数,可迭代对象,迭代器
Apr 29 Python
python 判断linux进程,并杀死进程的实现方法
Jul 01 Python
Python计算公交发车时间的完整代码
Feb 12 Python
Python OpenCV读取显示视频的方法示例
Feb 20 Python
浅谈优化Django ORM中的性能问题
Jul 09 Python
python asyncio 协程库的使用
Jan 21 Python
No module named ‘win32gui‘ 的解决方法(踩坑之旅)
Feb 18 Python
在 Python 中利用 Pool 进行多线程
Apr 24 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提取字符串中的图片地址[正则表达式]
2011/11/12 PHP
解析百度搜索结果link?url=参数分析 (全)
2012/10/09 PHP
phpnow php探针环境检测代码
2014/11/04 PHP
php购物车实现方法
2015/01/03 PHP
浅谈JavaScript编程语言的编码规范
2011/10/21 Javascript
JS关闭窗口或JS关闭页面的几种代码分享
2013/10/25 Javascript
关于页面嵌入swf覆盖div层的问题的解决方法
2014/02/11 Javascript
Javascript学习笔记之数组的构造函数
2014/11/23 Javascript
浅析JavaScript动画
2015/06/10 Javascript
基于vue.js实现的分页
2018/03/13 Javascript
layui select获取自定义属性方法
2018/08/15 Javascript
vue中的ref和$refs的使用
2018/11/22 Javascript
微信小程序如何利用getCurrentPages进行页面传值
2019/07/01 Javascript
JS实现打字游戏
2019/12/17 Javascript
微信小程序调用wx.getImageInfo遇到的坑解决
2020/05/31 Javascript
[04:09]2018年度DOTA2社区贡献奖-完美盛典
2018/12/16 DOTA
对于Python的框架中一些会话程序的管理
2015/04/20 Python
详解Python编程中基本的数学计算使用
2016/02/04 Python
Django项目中model的数据处理以及页面交互方法
2018/05/30 Python
浅谈python在提示符下使用open打开文件失败的原因及解决方法
2018/11/30 Python
python 对多个csv文件分别进行处理的方法
2019/01/07 Python
Python解压 rar、zip、tar文件的方法
2019/11/19 Python
Python变量及数据类型用法原理汇总
2020/08/06 Python
python中字符串的编码与解码详析
2020/12/03 Python
HTML5之SVG 2D入门2—图形绘制(基本形状)介绍及使用
2013/01/30 HTML / CSS
英国老牌潮鞋店:Offspring
2019/08/19 全球购物
New Balance德国官方网站:购买鞋子和服装
2019/08/31 全球购物
公务员的自我鉴定
2013/10/26 职场文书
幼儿园元旦亲子活动方案
2014/02/17 职场文书
创建青年文明号材料
2014/05/09 职场文书
党员批评与自我批评思想汇报
2014/10/08 职场文书
护理工作个人总结
2015/03/03 职场文书
上诉状格式
2015/05/23 职场文书
Django一小时写出账号密码管理系统
2021/04/29 Python
关于html选择框创建占位符的问题
2021/06/09 HTML / CSS
navicat 连接Ubuntu虚拟机的mysql的操作方法
2022/04/02 MySQL