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生成随机数主要通过random、secrets和numpy.random模块实现,random适用于日常场景,secrets确保密码学安全,numpy.random适合科学计算,了解各模块功能和示例代码,可以帮助你根据需求选择合适的生成方法,需要的朋友可以参考下
    2026-04-04
  • python和php哪个容易学

    python和php哪个容易学

    在本篇文章里小编给大家整理的是一篇关于python和php哪个学起来简单的相关文章,需要的朋友们可以参考下。
    2020-06-06
  • python dataframe常见操作方法:实现取行、列、切片、统计特征值

    python dataframe常见操作方法:实现取行、列、切片、统计特征值

    今天小编就为大家分享一篇python dataframe常见操作方法:实现取行、列、切片、统计特征值,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • 详解Python flask的前后端交互

    详解Python flask的前后端交互

    这篇文章主要为大家详细介绍了Python flask的前后端交互,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了

    解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了

    这篇文章主要介绍了解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • 使用PyQt4 设置TextEdit背景的方法

    使用PyQt4 设置TextEdit背景的方法

    今天小编就为大家分享一篇使用PyQt4 设置TextEdit背景的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • Python带参数的装饰器运行原理解析

    Python带参数的装饰器运行原理解析

    这篇文章主要介绍了Python带参数的装饰器运行原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • python删除指定类型(或非指定)的文件实例详解

    python删除指定类型(或非指定)的文件实例详解

    这篇文章主要介绍了python删除指定类型(或非指定)的文件,以实例形式较为详细的分析了Python删除文件的相关技巧,需要的朋友可以参考下
    2015-07-07
  • 详解Python如何利用Shelve进行数据存储

    详解Python如何利用Shelve进行数据存储

    Shelve是Python标准库中的一个模块,用于实现简单的数据持久化,本文将详细介绍Shelve模块的功能和用法,并提供丰富的示例代码,希望对大家有所帮助
    2023-11-11
  • Python Final 类型限定符详解

    Python Final 类型限定符详解

    Python的Final是一种类型限定符,用于标记变量、属性或函数参数,防止重新赋值,限制类的继承和方法重写,提高代码质量和可维护性,具有一定的参考价值,感兴趣的可以了解一下
    2026-05-05

最新评论