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??中对变量的赋值操作,实际上发生的为浅拷贝。

换句话说,此时两个变量指向同一块内存地址,如下所示:

Python中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??没有发生变化,这是由于我们使用了深拷贝。

此时的内存地址如下:

Python中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数组操作的浅拷贝和深拷贝的概念和背后的原理,同时给出了相应的代码示例。

来源:https://blog.51cto.com/u_15506603/5204068

标签:Python,Numpy,深拷贝,浅拷贝
0
投稿

猜你喜欢

  • CSS hack:区分IE6,IE7,firefox

    2007-12-23 10:25:00
  • Python通过DOM和SAX方式解析XML的应用实例分享

    2023-10-15 10:46:32
  • 对Python 语音识别框架详解

    2023-09-22 01:32:30
  • python 多线程中子线程和主线程相互通信方法

    2021-05-13 03:56:44
  • php中Array2xml类实现数组转化成XML实例

    2023-07-14 21:48:13
  • python函数参数(必须参数、可变参数、关键字参数)

    2023-09-17 07:54:28
  • Python pandas中read_csv参数示例详解

    2021-05-14 06:17:12
  • Python对比校验神器deepdiff库使用详解

    2023-05-14 11:05:35
  • Python Django view 两种return的实现方式

    2022-05-03 16:07:04
  • Django在pycharm下修改默认启动端口的方法

    2023-09-27 09:04:07
  • Django 创建新App及其常用命令的实现方法

    2023-05-20 09:04:47
  • C#调用Python模块的方法

    2021-04-13 15:29:10
  • Select 控件Combox加强版(IE Only)

    2008-07-23 13:26:00
  • asp使用XMLHTTP下载远程数据输出到浏览器

    2007-11-04 10:34:00
  • PyTorch开源图像分类工具箱MMClassification详解

    2023-11-21 02:20:06
  • python中is与双等于号“==”的区别示例详解

    2023-07-09 22:40:19
  • [翻译]标记语言和样式手册 chapter 6 短语元素

    2008-01-25 16:37:00
  • 20行代码教你用python给证件照换底色的方法示例

    2023-04-03 23:48:32
  • python的多线程原来可以这样解

    2021-02-22 16:12:18
  • python密码学RSA密码解密教程

    2023-07-29 17:01:47
  • asp之家 网络编程 m.aspxhome.com