Python中Numpy的深拷贝和浅拷贝

 更新时间:2022年05月24日 17:05:35   作者:sgzqc  
这篇文章主要介绍了Python中Numpy的深拷贝和浅拷贝,通过讲解Python中对Numpy数组操作的浅拷贝和深拷贝的概念和背后的原理展开全文,需要的小伙伴可以参考一下

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

到此这篇关于Python中Numpy的深拷贝和浅拷贝的文章就介绍到这了,更多相关Python Numpy 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Django定时任务模块设计与实践

    详解Django定时任务模块设计与实践

    这篇文章主要介绍了详解Django定时任务模块设计与实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • python使用append合并两个数组的方法

    python使用append合并两个数组的方法

    这篇文章主要介绍了python使用append合并两个数组的方法,涉及Python中append方法的使用技巧,需要的朋友可以参考下
    2015-04-04
  • python3.6编写的单元测试示例

    python3.6编写的单元测试示例

    这篇文章主要介绍了python3.6编写的单元测试,结合实例形式分析了Python3.6使用unittest模块进行单元测试的相关操作技巧与注意事项,需要的朋友可以参考下
    2019-08-08
  • Python字符串对齐方法使用(ljust()、rjust()和center())

    Python字符串对齐方法使用(ljust()、rjust()和center())

    这篇文章主要介绍了Python字符串对齐方法使用(ljust()、rjust()和center()),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Python使用re模块实现信息筛选的方法

    Python使用re模块实现信息筛选的方法

    这篇文章主要介绍了Python使用re模块实现信息筛选的方法,结合实例形式分析了Python正则re模块进行信息筛选操作的相关实现技巧及相关函数使用技巧,需要的朋友可以参考下
    2018-04-04
  • Python的互斥锁与信号量详解

    Python的互斥锁与信号量详解

    这篇文章主要介绍了Python的互斥锁与信号量详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Django 中间键和上下文处理器的使用

    Django 中间键和上下文处理器的使用

    这篇文章主要介绍了Django 中间键和上下文处理器的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • tensorflow卷积神经Inception V3网络结构代码解析

    tensorflow卷积神经Inception V3网络结构代码解析

    这篇文章主要为大家介绍了卷积神经Inception V3网络结构代码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • python+appium实现自动化测试的示例代码

    python+appium实现自动化测试的示例代码

    appium是一个开源的测试自动化框架,可以与原生的、混合的和移动的web应用程序使用,本文主要介绍了python+appium实现自动化测试的示例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • python使用原始套接字发送二层包(链路层帧)的方法

    python使用原始套接字发送二层包(链路层帧)的方法

    今天小编就为大家分享一篇python使用原始套接字发送二层包(链路层帧)的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07

最新评论