NumPy 数组的复制的几种实现方法

 更新时间:2026年01月06日 09:36:38   作者:溯维_Particle  
本文详细讲解了在NumPy中操作数组时的三种复制机制,包括无复制、视图/浅复制以及深复制,下面就来详细的介绍一下这三种复制的实现,感兴趣的可以来了解一下

在 NumPy 中操作数组时,理解数据的复制机制是避免逻辑错误和内存浪费的关键。新手常因混淆 “复制” 与 “引用” 而踩坑,本文将系统讲解三种场景:无复制、视图(浅复制)和深复制。

1  无复制(No Copy at All)

简单赋值或函数传参时,不会复制数组对象或其数据,只是对同一对象的 “重命名” 或 “引用传递”。

1.1  简单赋值:同一对象的多个名称

import numpy as np

# 定义原始数组
a = np.array([[0, 1, 2, 3],
              [4, 5, 6, 7],
              [8, 9, 10, 11]])
b = a  # 无新对象创建,b是a的“别名”
print(b is a)  # 输出 True,证明是同一对象

此时修改 b 会直接改变 a,因为它们指向同一块内存。

1.2  函数调用的引用传递

Python 中可变对象(如 NumPy 数组)以引用方式传递给函数,函数内的操作会影响原对象。

2  视图 / 浅复制(View or Shallow Copy)

视图会创建新的数组对象,但共享原始数组的数据。新数组是原数据的 “窗口”,数据本身未被复制。

2.1  view()方法创建视图

c = a.view()
print(c is a)        # 输出 False,c是新对象
print(c.base is a)   # 输出 True,c的底层数据由a持有
print(c.flags.owndata)  # 输出 False,c不“拥有”自己的数据

2.2  视图的 “形状独立,数据共享”

视图可以独立修改形状,不影响原数组;但修改数据会同步影响原数组。

c = c.reshape((2, 6))  # 修改c的形状
print(a.shape)         # 原数组a形状仍为(3, 4)

c[0, 4] = 1234         # 修改c的数据
print(a)
# 输出:
# array([[   0,    1,    2,    3],
#        [1234,    5,    6,    7],
#        [   8,    9,   10,   11]])

2.3  数组切片返回视图

对数组切片时,返回的是原数组的视图,而非新数组。

s = a[:, 1:3]  # 切片得到视图s
s[:] = 10      # 修改视图的数据(注意是s[:] = 10,不是s = 10)
print(a)
# 输出:
# array([[   0,   10,   10,    3],
#        [1234,   10,   10,    7],
#        [   8,   10,   10,   11]])

注意:s[:] = 10 是修改视图数据,而 s = 10 是将 s 重新赋值为新对象,不再关联原数组。

3  深复制(Deep Copy)

深复制会创建原数组及其数据的完整副本,新数组拥有独立的内存空间,与原数组完全解耦。

3.1  copy()方法创建深复制

d = a.copy()
print(d is a)        # 输出 False,d是新对象
print(d.base is a)   # 输出 False,d与a无任何共享

3.2  深复制的数据独立性

修改深复制的数组不会影响原数组。

d[0, 0] = 9999
print(a)  # 原数组a不受影响,输出与之前一致

3.3  大数组切片的内存优化

当原始数组很大,且仅需要其一小部分时,对切片进行深复制可释放原始数组的内存。

a = np.arange(int(1e8))  # 创建超大数组
b = a[:100].copy()       # 对切片深复制,b拥有独立数据
del a                    # 可释放a占用的大量内存

如果用 b = a[:100](视图),a 会被 b 引用,即使 del a 也无法释放内存。

4  总结:三种方式对比

类型是否创建新对象是否共享数据操作 / 方法数据修改影响
无复制简单赋值、函数传参原数组与新变量相互影响
视图(浅复制)view()、数组切片数据修改相互影响,形状修改不影响原数组
深复制copy()原数组与新数组完全独立

掌握这三种机制,能让你在处理 NumPy 数组时更精准地控制内存和数据一致性,写出更健壮的代码。

到此这篇关于NumPy 数组的复制的几种实现方法的文章就介绍到这了,更多相关NumPy 数组复制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 寻找网站后台地址的python脚本

    寻找网站后台地址的python脚本

    这篇文章主要介绍了用python实现的寻找网站后台地址的脚本代码,国外牛人的作品,需要的朋友可以参考下
    2014-09-09
  • Python实现将MP4视频转化为GIF图像

    Python实现将MP4视频转化为GIF图像

    与静态图像相比,动态的 GIF 图片更能吸引各位读者的注意力,还可以提供更生动、有趣和引人入胜的内容,本文为大家介绍了Python将MP4视频转化为GIF图像的方法,需要的可以参考下
    2023-06-06
  • Python文件相关操作和方法汇总大全

    Python文件相关操作和方法汇总大全

    这篇文章主要介绍了Python文件相关操作和方法汇总大全,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • Python批量改变图片名字的示例代码

    Python批量改变图片名字的示例代码

    本文主要介绍了Python批量改变图片名字的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法

    pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法

    今天小编就为大家分享一篇pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • python错误调试及单元文档测试过程解析

    python错误调试及单元文档测试过程解析

    这篇文章主要介绍了python错误调试及单元文档测试过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • python实现多线程的方式及多条命令并发执行

    python实现多线程的方式及多条命令并发执行

    这篇文章主要为大家详细介绍了python实现多线程的方式及多条命令并发执行,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • python实现字符串完美拆分split()的方法

    python实现字符串完美拆分split()的方法

    今天小编就为大家分享一篇python实现字符串完美拆分split()的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Python字典取键、值对的方法步骤

    Python字典取键、值对的方法步骤

    这篇文章主要介绍了Python字典取键、值对的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • python 读入多行数据的实例

    python 读入多行数据的实例

    下面小编就为大家分享一篇python 读入多行数据的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04

最新评论