当前位置: 首页 > news >正文

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

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

1 无复制(No Copy at All)

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

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

1

2

3

4

5

6

7

8

importnumpy as np

# 定义原始数组

a=np.array([[0,1,2,3],

[4,5,6,7],

[8,9,10,11]])

b=a# 无新对象创建,b是a的“别名”

print(bisa)# 输出 True,证明是同一对象

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

1.2 函数调用的引用传递

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

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

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

2.1 view()方法创建视图

1

2

3

4

c=a.view()

print(cisa)# 输出 False,c是新对象

print(c.baseisa)# 输出 True,c的底层数据由a持有

print(c.flags.owndata)# 输出 False,c不“拥有”自己的数据

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

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

1

2

3

4

5

6

7

8

9

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 数组切片返回视图

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

1

2

3

4

5

6

7

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()方法创建深复制

1

2

3

d=a.copy()

print(disa)# 输出 False,d是新对象

print(d.baseisa)# 输出 False,d与a无任何共享

3.2 深复制的数据独立性

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

1

2

d[0,0]=9999

print(a)# 原数组a不受影响,输出与之前一致

3.3 大数组切片的内存优化

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

1

2

3

a=np.arange(int(1e8))# 创建超大数组

b=a[:100].copy()# 对切片深复制,b拥有独立数据

dela# 可释放a占用的大量内存

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

4 总结:三种方式对比

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

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

http://www.jsqmd.com/news/648171/

相关文章:

  • Mysql--基础知识点--100-- insert VS select...for update 加锁
  • Ubuntu20.04编译Carla0.9.13实战:从环境配置到资源下载的完整避坑指南
  • Ubuntu系统中sogou输入法的安装与常见问题解决指南
  • EVA-01部署教程:Qwen2.5-VL-7B模型微调+领域适配(NERV战术语料)
  • 沟通力决定薪资:技术人的表达升级课
  • AI+Simulink新手避坑指南:从数据准备到模型部署的完整工作流
  • 硬件设计进阶:光耦在隔离驱动与信号转换中的实战解析
  • TLPI 第3章 练习:System Programming Concepts
  • 青少年软编等考五级题解目录
  • AutoSAR ETH Driver集成LwIP:Tc3XX平台下接收中断与发送缓冲区的配置与调试指南
  • 小红书博主必看:AI智能体如何5分钟搞定高颜值封面+3张内容页(附保姆级教程)
  • VPet存档迁移终极指南:如何快速升级旧版本数据到v2格式
  • python-gitlab CLI 工具深度解析:30个常用命令让 GitLab 管理变得简单
  • Ansible之Playbook(六):实例部署实战
  • MQTT over WebSocket实战指南:从EMQX安装到消息收发全流程
  • 该贴已作废
  • 告别深度依赖:手把手拆解BEVFormer如何用Transformer实现纯视觉BEV感知
  • 旋风分离器几何建模避坑指南:Star CCM+中布尔运算的5个常见错误
  • DeepSeek LeetCode 1434.每个个戴不同帽子的方案数 public int numberWays(List<List<Integer>> hats)
  • 从‘看图说话’到‘看截图答题’:MMMU-Pro如何模拟真实用户场景来‘拷问’AI?
  • Vue3 项目集成 OnlyOffice 在线编辑 + 自定义插件开发(一)
  • DeepSeek LeetCode 1439. 有序矩阵中的第 k 个最小数组和 public int kthSmallest(int[][] mat, int k)
  • Python 装饰器高级应用指南
  • 手把手教你用DigNet从scRNA-seq数据构建基因调控网络(附乳腺癌案例解析)
  • PyTorch 2.8镜像高清案例:Stable Video Diffusion生成电影级运镜视频截图
  • 玻璃幕墙的自爆原因,以及安全隐患分析
  • GeographicLib 地理计算库终极指南:从WMM2025地磁模型到高精度坐标转换实战
  • c++ string字符串详解
  • 渗透测试中的优先级选择:以Misdirection靶机为例解析如何避免死磕
  • IndexTTS-2-LLM与Tacotron2对比:新一代TTS优势分析