news 2026/8/19 10:08:01

HoRain云--NumPy 副本和视图

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HoRain云--NumPy 副本和视图

副本是一个数据的完整的拷贝,如果我们对副本进行修改,它不会影响到原始数据,物理内存不在同一位置。

视图是数据的一个别称或引用,通过该别称或引用亦便可访问、操作原有数据,但原有数据不会产生拷贝。如果我们对视图进行修改,它会影响到原始数据,物理内存在同一位置。

视图一般发生在:

  • 1、numpy 的切片操作返回原数据的视图。
  • 2、调用 ndarray 的 view() 函数产生一个视图。

副本一般发生在:

  • Python 序列的切片操作,调用deepCopy()函数。
  • 调用 ndarray 的 copy() 函数产生一个副本。

无复制

简单的赋值不会创建数组对象的副本。 相反,它使用原始数组的相同id()来访问它。 id()返回 Python 对象的通用标识符,类似于 C 中的指针。

此外,一个数组的任何变化都反映在另一个数组上。 例如,一个数组的形状改变也会改变另一个数组的形状。

实例

import numpy as np a = np.arange(6) print ('我们的数组是:') print (a) print ('调用 id() 函数:') print (id(a)) print ('a 赋值给 b:') b = a print (b) print ('b 拥有相同 id():') print (id(b)) print ('修改 b 的形状:') b.shape = 3,2 print (b) print ('a 的形状也修改了:') print (a)

输出结果为:

我们的数组是: [0 1 2 3 4 5] 调用 id() 函数: 4349302224 a 赋值给 b: [0 1 2 3 4 5] b 拥有相同 id(): 4349302224 修改 b 的形状: [[0 1] [2 3] [4 5]] a 的形状也修改了: [[0 1] [2 3] [4 5]]

视图或浅拷贝

ndarray.view() 方会创建一个新的数组对象,该方法创建的新数组的维数变化不会改变原始数据的维数。

实例

import numpy as np # 最开始 a 是个 3X2 的数组 a = np.arange(6).reshape(3,2) print ('数组 a:') print (a) print ('创建 a 的视图:') b = a.view() print (b) print ('两个数组的 id() 不同:') print ('a 的 id():') print (id(a)) print ('b 的 id():' ) print (id(b)) # 修改 b 的形状,并不会修改 a b.shape = 2,3 print ('b 的形状:') print (b) print ('a 的形状:') print (a)

输出结果为:

数组 a: [[0 1] [2 3] [4 5]] 创建 a 的视图: [[0 1] [2 3] [4 5]] 两个数组的 id() 不同: a 的 id(): 4314786992 b 的 id(): 4315171296 b 的形状: [[0 1 2] [3 4 5]] a 的形状: [[0 1] [2 3] [4 5]]

使用切片创建视图修改数据会影响到原始数组:

实例

import numpy as np arr = np.arange(12) print ('我们的数组:') print (arr) print ('创建切片:') a=arr[3:] b=arr[3:] a[1]=123 b[2]=234 print(arr) print(id(a),id(b),id(arr[3:]))

输出结果为:

我们的数组: [ 0 1 2 3 4 5 6 7 8 9 10 11] 创建切片: [ 0 1 2 3 123 234 6 7 8 9 10 11] 4545878416 4545878496 4545878576

变量 a,b 都是 arr 的一部分视图,对视图的修改会直接反映到原数据中。但是我们观察 a,b 的 id,他们是不同的,也就是说,视图虽然指向原数据,但是他们和赋值引用还是有区别的。

副本或深拷贝

ndarray.copy() 函数创建一个副本。 对副本数据进行修改,不会影响到原始数据,它们物理内存不在同一位置。

实例

import numpy as np a = np.array([[10,10], [2,3], [4,5]]) print ('数组 a:') print (a) print ('创建 a 的深层副本:') b = a.copy() print ('数组 b:') print (b) # b 与 a 不共享任何内容 print ('我们能够写入 b 来写入 a 吗?') print (b is a) print ('修改 b 的内容:') b[0,0] = 100 print ('修改后的数组 b:') print (b) print ('a 保持不变:') print (a)

输出结果为:

数组 a: [[10 10] [ 2 3] [ 4 5]] 创建 a 的深层副本: 数组 b: [[10 10] [ 2 3] [ 4 5]] 我们能够写入 b 来写入 a 吗? False 修改 b 的内容: 修改后的数组 b: [[100 10] [ 2 3] [ 4 5]] a 保持不变: [[10 10] [ 2 3] [ 4 5]]
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/19 10:06:05

TacoMAS:多智能体系统在运行时的动态协同进化机制

1. 项目概述:当多智能体系统学会在运行时“自我进化”最近在折腾大语言模型驱动的多智能体系统时,我总在琢磨一个问题:我们费尽心思设计好的智能体角色、它们之间的协作流程,一旦部署上线,是不是就“固化”了&#xff…

作者头像 李华
网站建设 2026/8/19 10:00:35

上海APP小程序开发哪家公司靠谱?能否打通ERP、CRM、WMS很关键

不少企业已经有ERP、CRM或WMS,再做APP和小程序时,希望用户、销售、门店或仓库可以通过移动端完成操作。此时项目真正的难点不在于做一个漂亮界面,而在于新系统能否与现有数据形成一致。商品、库存、客户、订单到底以哪个系统为准,…

作者头像 李华
网站建设 2026/8/19 10:00:28

2026四大AI论文平台深度横评|学术写作不是堆砌,工具要服务于思维

近几年 AI 写论文早已普及,但工具乱用直接踩雷。 很多同学分不清通用 AI 和学术 AI 的区别,不管是课程作业还是毕业论文,随便套用工具改写、润色、降重。最终出现 AI 检测超标、重复率居高不下、格式不符合学校规范、文献综述逻辑混乱等问题&…

作者头像 李华
网站建设 2026/8/19 9:58:59

基于ESP32的智能植物柜控制系统:从硬件设计到物联网应用

1. 项目概述:当植物柜遇上智能控制器 如果你和我一样,是个喜欢在家里摆弄花花草草,但又常常因为忘记浇水、搞不清光照而把绿萝养成了“黄萝”的植物杀手,那么这个“PlantCabinet Controller”项目可能就是你的救星。简单来说&…

作者头像 李华
网站建设 2026/8/19 9:56:01

Proteus仿真入门:从零搭建74LS32或门电路与逻辑分析

1. 项目概述:在Proteus中搭建一个逻辑门电路 如果你刚开始接触数字电路或者嵌入式系统的仿真,Proteus绝对是一个绕不开的名字。它不仅仅是一个电路图绘制工具,更是一个强大的混合模式仿真器,能让你在电脑上就把单片机程序跑起来&a…

作者头像 李华