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

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]]
http://www.cnnetsun.cn/news/4097047.html

相关文章:

  • TacoMAS:多智能体系统在运行时的动态协同进化机制
  • 上海APP小程序开发哪家公司靠谱?能否打通ERP、CRM、WMS很关键
  • 2026四大AI论文平台深度横评|学术写作不是堆砌,工具要服务于思维
  • 基于ESP32的智能植物柜控制系统:从硬件设计到物联网应用
  • 基于智能体工作流与RAG的靶向蛋白降解文献知识自动化抽取系统构建
  • Proteus仿真入门:从零搭建74LS32或门电路与逻辑分析
  • Windows 7虚拟机VMware Tools安装失败:深度排查与解决方案
  • D5 | Prompt 工程基础:CRISPE 框架 + 6 个万能模板
  • Wand-Enhancer 上手全攻略:3步解锁WeMod Pro高级功能
  • Zephyr调度器:物联网RTOS多任务管理的核心机制与实践
  • geoserver使用pg数据库的空间数据
  • 2026AI论文工具公正排行榜[特殊字符]6款实测|附官网+真实优缺点
  • 24小时不下播!AI虚拟数字人直播全流程搭建教程(附软件清单)
  • 两步完成网易云NCM转MP3:ncmdumpGUI开源工具使用全攻略
  • 自动驾驶轮椅技术解析:从SLAM到路径规划的室内自主导航实践
  • 5分钟搞定Switch手柄连接电脑:BetterJoy免费适配工具完整指南
  • 如何把 ComfyUI 工作流快速分享到第三方平台:开发者实战指南
  • 把 PC 大作搬进客厅与口袋:Sunshine 免费游戏串流从零上手全攻略
  • 数据库分支技术如何应对智能体驱动的应用范式挑战?
  • 从黑盒子到透明厨房:深入解析英飞凌XCM系列MCU体系架构与开发实战
  • LLM智能体在自动化软件分析中的评估与实践:C/C++与Java专项挑战
  • 高阶多智能体系统基于距离的编队控制与规定性能约束设计
  • 个人/公司远程设备难区分? ToDesk团队版:场景自由切换,隐私安全有保障
  • 构建高保真用户模拟器:弥合AI智能体评测中的现实鸿沟
  • 基于Yosys与APIO的开源FPGA工具链实战:从环境搭建到项目优化
  • AY-3-8910芯片语音合成实战:从方波到可编程语音
  • AI服务中断自救指南:从Claude到本地开源模型的完整迁移方案
  • RTOS任务调度与队列通信:从礼让机制到实战优化
  • 多普勒效应原理与应用:从声音变调到雷达测速的全面解析
  • 【Bug已解决】Stale `xfail` markers in `langchain-core` tests: `test_convert_to_openai_function_nested_v2…