在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 自定义用户user模型的三种方法
Nov 18 Python
使用Python脚本在Linux下实现部分Bash Shell的教程
Apr 17 Python
python实现从ftp服务器下载文件的方法
Apr 30 Python
简介Python设计模式中的代理模式与模板方法模式编程
Feb 02 Python
python实现二维插值的三维显示
Dec 17 Python
Python scrapy增量爬取实例及实现过程解析
Dec 24 Python
如何使用Python抓取网页tag操作
Feb 14 Python
python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法
Feb 26 Python
Python读取xlsx数据生成图标代码实例
Aug 12 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
Feb 25 Python
Python中相见恨晚的技巧
Apr 13 Python
PyTorch 如何检查模型梯度是否可导
Jun 05 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
《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
windows下开发并编译PHP扩展的方法
2011/03/18 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
2013/01/11 PHP
基于Zookeeper的使用详解
2013/05/02 PHP
PHP下打开phpMyAdmin出现403错误的问题解决方法
2013/05/23 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
2013/06/25 PHP
PHP ignore_user_abort函数详细介绍和使用实例
2014/07/15 PHP
php检查页面是否被百度收录
2015/10/28 PHP
php 指定范围内多个随机数代码实例
2016/07/18 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
jQuery中对节点进行操作的相关介绍
2013/04/16 Javascript
angular+ionic 的app上拉加载更新数据实现方法
2017/01/16 Javascript
一篇看懂vuejs的状态管理神器 vuex状态管理模式
2017/04/20 Javascript
d3.js入门教程之数据绑定详解
2017/04/28 Javascript
Angular2 父子组件数据通信实例
2017/06/22 Javascript
详解a++和++a的区别
2017/08/30 Javascript
Vue修改mint-ui默认样式的方法
2018/02/03 Javascript
vue下拉列表功能实例代码
2018/04/08 Javascript
解决在vue项目中webpack打包后字体不生效的问题
2018/09/01 Javascript
Javascript 关于基本类型和引用类型的个人理解
2019/11/01 Javascript
vue使用better-scroll实现滑动以及左右联动
2020/06/30 Javascript
浅谈使用nodejs搭建web服务器的过程
2020/07/20 NodeJs
vue中重定向redirect:‘/index‘,不显示问题、跳转出错的完美解决
2020/09/28 Javascript
梳理一下vue中的生命周期
2020/12/30 Vue.js
用Python解析XML的几种常见方法的介绍
2015/04/09 Python
Python中的map()函数和reduce()函数的用法
2015/04/27 Python
详解Django中CBV(Class Base Views)模型源码分析
2019/02/25 Python
python tqdm库的使用
2020/11/30 Python
伦敦高达60%折扣的钻石珠宝商:Purely Diamonds
2018/06/24 全球购物
庆元旦演讲稿
2014/09/15 职场文书
教师节感谢信
2015/01/22 职场文书
邀请函样本
2015/02/02 职场文书
经济纠纷起诉状
2015/05/20 职场文书
活动简报范文
2015/07/22 职场文书
一小时学会TensorFlow2之基本操作2实例代码
2021/09/04 Python
GoFrame框架数据校验之校验结果Error接口对象
2022/06/21 Golang