Python中Numpy的深拷贝和浅拷贝
作者:sgzqc 发布时间:2021-10-04 21:08:43
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?
?中对变量的赋值操作,实际上发生的为浅拷贝。
换句话说,此时两个变量指向同一块内存地址,如下所示:
所以,此时如果我们修改数组??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?
?没有发生变化,这是由于我们使用了深拷贝。
此时的内存地址如下:
由于 ??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数组操作的浅拷贝和深拷贝的概念和背后的原理,同时给出了相应的代码示例。
来源:https://blog.51cto.com/u_15506603/5204068


猜你喜欢
- 1、子类可以继承父类,同样,父类也可以继承自己的父类,一层一层地继承。class A:def have(self):print('I
- var Fundamental = {count:1}; function Test(){} Test.prototype = Fundam
- 本文实例为大家分享了python实现五子棋双人对弈的具体代码,供大家参考,具体内容如下我用的是pygame模块来制作窗口代码如下:# 1、引
- 大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧。那么这次为大家带来,Python爬取糗事百科的小段子的例子。首
- 汇总整理一套Python网页爬虫,文本处理,科学计算,机器学习和数据挖掘的兵器谱。1. Python网页爬虫工具集一个真实的项目,一定是从获
- 由于该项目是针对中小学生竞赛并且是第一次举行,所以识别的目标交通标志仅仅只有直行、右转、左转和停车让行。数据集:链接: https://pa
- Go微服务网关从核心原理理解网关的本质网关具备的基本功能:支持多种协议代理:tcp/http/ websocket/grpc支持多种负载均衡
- python爬虫要用到的库:请求库:实现 HTTP 请求操作urllib:一系列用于操作URL的功能。requests:基于 urllib
- 1、subprocess这个模块来产生子进程,并且可以连接到子进程的标准输入、输出、错误中,还可以获得子进程的返回值。2、subproces
- 1、安装 nvmcurl -o- https://raw.githubusercontent.com/creationix/nvm/v0.3
- 本文实例讲述了go语言睡眠排序算法。分享给大家供大家参考。具体分析如下:睡眠排序算法是一个天才程序员发明的,想法很简单,就是针对数组里的不同
- 关于SQL server2005中插入汉字变成问号的解决办法 1.右击你所建的数据库,点击“属性”,选择“选项”并点击。将其中的排序规则设置
- 如下所示:<!doctype html><html lang="en"> <head>
- 我就废话不多说了,大家还是直接看代码吧~'''Created on 2018-4-16'''
- Google的开源Android移动操作系统正在席卷全球智能手机市场,和苹果不一样,它对那些想将应用程序提交到iPhone App Stor
- Python中的set集合一、集合是什么?集合是什么呢?相信读者朋友们哪怕是没有用过集合这个数据类型。也一定在数学课堂上听过集合这个名词。数
- numpy norm()函数求范数函数:norm(x, ord = None, axis = None, keepdims = False)
- SQL Server 2016带来全新突破性的 in-memory性能和分析功能来实现关键任务处理。全面的安全特性 -Alway
- 函数的必选参数,指的是函数调用的时候必须传入的参数import mathdef cal (n): return n * nvar
- 搞了一个DIV+CSS菜单,兼容Firefox,分享给大家,大家一齐学习 <!DOCTYPE html PUBLIC "-/