人工智能之数据分析 numpy:第十章 副本视图

人工智能之数据分析 numpy

第十章 副本视图


@

目录
  • 人工智能之数据分析 numpy
  • 前言
    • 一、核心概念
    • 二、如何判断是副本还是视图?
    • 三、常见操作:返回视图 vs 副本
      • ✅ 返回 视图 的操作(共享数据)
      • ✅ 返回 副本 的操作(独立数据)
    • 四、reshape() 和 ravel() 的细节对比
    • 五、实战陷阱:意外修改原数组
      • ❌ 错误示例:以为切片是副本
      • ✅ 正确做法:明确需要副本时用 .copy()
    • 六、何时用视图?何时用副本?
    • 七、总结速查表
    • 八、最佳实践建议
  • 后续
  • 资料关注


前言

在 NumPy 中,副本(copy)视图(view) 是理解数组内存管理、性能优化和避免意外修改的关键概念。它们决定了当你对一个数组进行切片、变形或赋值操作时,​是否创建了新的数据副本,还是仅仅创建了一个指向原数据的新“窗口”​。

下面从原理、区别、判断方法到实战示例,详细解析:


一、核心概念

概念 含义 是否共享数据 修改影响
副本(Copy) 完全独立的新数组,拥有自己的内存空间 ❌ 不共享 修改副本不影响原数组
视图(View) 原数组的一个“窗口”或“别名”,不复制数据 ✅ 共享 修改视图会改变原数组

💡 ​关键点​:NumPy 默认尽可能返回 ​视图​(为了节省内存和提升速度),只有在必要时才返回副本。


二、如何判断是副本还是视图?

使用数组的 .base 属性:

  • 如果 arr.base is None这是一个副本(或原始数组)
  • 如果 arr.base is not None这是一个视图,base 指向原始数组
import numpy as npa = np.array([1, 2, 3, 4])
b = a.view()      # 显式创建视图
c = a.copy()      # 显式创建副本
d = a[1:3]        # 切片(通常返回视图)print(b.base is a)  # True  → 视图
print(c.base is a)  # False → 副本(c.base is None)
print(d.base is a)  # True  → 视图(切片是视图!)

三、常见操作:返回视图 vs 副本

✅ 返回 视图 的操作(共享数据)

操作 示例 说明
切片(slicing) a[1:4] 最常见!
np.view() a.view() 显式创建视图
reshape()(当可能时) a.reshape(2,2) 如果不改变数据布局,返回视图
转置 T a.T 对高维数组通常是视图
a = np.array([[1, 2], [3, 4]])
b = a.reshape(4,)   # 视图(连续内存)
b[0] = 99
print(a)  # [[99, 2], [3, 4]] → 原数组被修改!

⚠️ 注意:reshape()不一定总是视图​!如果无法在不复制数据的情况下 reshape(如非连续数组),NumPy 会自动返回副本。

✅ 返回 副本 的操作(独立数据)

操作 示例 说明
np.copy() a.copy() 显式深拷贝
花式索引(fancy indexing) a[[0, 2, 1]] 总是副本
布尔索引 a[a > 2] 总是副本
flatten() a.flatten() 总是返回副本
ravel()(有时) a.ravel() 尽量返回视图,不行则副本(与 flatten 不同)
a = np.array([1, 2, 3, 4])# 花式索引 → 副本
b = a[[0, 2]]
b[0] = 99
print(a)  # [1, 2, 3, 4] → 未变# flatten → 副本
c = a.flatten()
c[0] = 88
print(a)  # 仍为 [1, 2, 3, 4]

四、reshape() 和 ravel() 的细节对比

方法 是否修改原数组 返回类型 内存行为
arr.reshape(...) 新数组 尽量视图,否则副本
arr.resize(...) 无返回(in-place) 直接修改原数组形状
arr.ravel() 一维数组 尽量视图
arr.flatten() 一维数组 总是副本
a = np.array([[1, 2], [3, 4]])# ravel() → 视图(因为 a 是连续的)
b = a.ravel()
b[0] = 99
print(a)  # [[99, 2], [3, 4]]# flatten() → 副本
c = a.flatten()
c[0] = 88
print(a)  # 仍是 [[99, 2], [3, 4]]

五、实战陷阱:意外修改原数组

❌ 错误示例:以为切片是副本

data = np.array([10, 20, 30, 40])
subset = data[1:3]      # 这是视图!
subset[0] = 999         # 你以为只改 subset?
print(data)             # [10, 999, 30, 40] → 原数组被改了!

✅ 正确做法:明确需要副本时用 .copy()

data = np.array([10, 20, 30, 40])
subset = data[1:3].copy()  # 显式创建副本
subset[0] = 999
print(data)                # [10, 20, 30, 40] → 安全!

六、何时用视图?何时用副本?

场景 推荐
只读访问子数据​(如分析某段信号) 用视图(高效)
需要修改子数据但不想影响原数组 .copy()
函数内部处理数组,不确定是否会被修改 默认 .copy() 更安全
内存受限,且确定不会修改 用视图节省内存

七、总结速查表

操作 返回 是否共享数据 安全修改?
a[:] 视图 ❌(会影响 a)
a[1:3] 视图
a[[1,2]] 副本
a[a>0] 副本
a.reshape(...) 视图(尽量) 可能 谨慎
a.copy() 副本
a.view() 视图
a.flatten() 副本
a.ravel() 视图(尽量) 可能 谨慎

八、最佳实践建议

  1. 永远不要假设切片是副本 → 如需独立数据,显式调用 .copy()
  2. 在函数参数中接收数组时,若要修改,先 .copy() 避免副作用
  3. 使用 .base 属性调试内存关系
  4. 处理大型数组时,优先使用视图以节省内存,但要小心写操作

后续

本文主要讲述了numpy数组副本和视图。python过渡项目部分代码已经上传至gitee,后续会逐步更新,主要受时间原因限制,当然自己也可以克隆到本地学习拓展。

资料关注

公众号:咚咚王
gitee:https://gitee.com/wy18585051844/ai_learning

《Python编程:从入门到实践》
《利用Python进行数据分析》
《算法导论中文第三版》
《概率论与数理统计(第四版) (盛骤) 》
《程序员的数学》
《线性代数应该这样学第3版》
《微积分和数学分析引论》
《(西瓜书)周志华-机器学习》
《TensorFlow机器学习实战指南》
《Sklearn与TensorFlow机器学习实用指南》
《模式识别(第四版)》
《深度学习 deep learning》伊恩·古德费洛著 花书
《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》
《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen)》
《自然语言处理综论 第2版》
《Natural-Language-Processing-with-PyTorch》
《计算机视觉-算法与应用(中文版)》
《Learning OpenCV 4》
《AIGC:智能创作时代》杜雨+&+张孜铭
《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》
《从零构建大语言模型(中文版)》
《实战AI大模型》
《AI 3.0》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/974142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

11月23日总结 - 作业----

11月23日总结学习英语六级内容

Node.js 端的接口签名处理

用MD5,SHA256,HMAC-SHA256,RSA-SHA256签名算法 适用场景 博客或网站接口:保护评论提交,数据查询等接口,防止恶意请求或数据篡改 前后端分离项目:确保前端发送的请求未被中间人篡改,验证请求来源合法性 服务间调…

2025年西北地区怎么选智慧水务系统服务商?陕西、宁夏、新疆、甘肃,优先选这些品牌。

随着水资源管理智能化升级加速,智慧水务系统已成为构建现代水治理体系的核心支撑。本榜单基于技术创新性、场景适配能力、服务保障体系三大维度,结合行业用户调研与项目实施数据,深度解析国内领先智慧水务服务商综合…

ABC433 解题报告

A 略。 B 略。 C 提取极长同色段。 D 考虑一个数在作为操作时的第一个数和第二个数时对余数的贡献。 E 先判掉 \(X\) 或 \(Y\) 中有重复元素的情况。 因为限制和最大值有关,考虑倒序填入每一个数 \(i\)。接下来分类讨…

k8s中的微服务 - 教程

k8s中的微服务 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "…

20232402 2025-2026-1 《网络与系统攻防技术》实验六实验报告

20232402 2025-2026-1 《网络与系统攻防技术》实验六实验报告 1.实验内容 1.1 发现Metasploitable2靶机,并对其进行端口扫描、漏洞扫描; 1.2 利用Vsftpd源码包后门漏洞; 1.3 利用SambaMS-RPC Shell命令注入漏洞; 1…

P2949 [USACO09OPEN] Work Scheduling G 题解

注意到反悔贪心的题基本没怎么做过。 P2949 [USACO09OPEN] Work Scheduling G 思路 注意到这是一个二维的东西,因此可能先去想 DP。但是注意到限制(时间)与贡献是独立的,因此考虑去扫时间而去维护贡献。 更准确地说…

the success of Japan

As the worlds most extremely violent country in English way become a forced peaceful country. The reason for a persons success lies in the diversity of thought.

预训练的卷积神经网络与普通卷积神经网络有什么区别

核心差别只有一点:“预训练”的权重已经在大规模数据上收敛过一次,而普通(从零开始)网络的权重仍是随机分布的。 除此之外,网络结构、前向计算、参数量、输入输出格式完全一样;差异只体现在“权重的初始状态”和…

人工智能之数据分析 numpy:第九章 数组运算

人工智能之数据分析 numpy:第九章 数组运算人工智能之数据分析 numpy 第九章 数组运算@目录人工智能之数据分析 numpy前言一、基础算术运算(Element-wise Arithmetic)1. 基本运算符(支持广播)2. 广播(Broadcasti…

Faster R-CNN中的Backbone,输入图片时,是标注过的图片吗

不是。Faster R-CNN 的 Backbone 在“前向推理阶段”只收一张裸图(像素矩阵),任何标注(框、类、掩码)都不进网络。标注只在“训练阶段计算损失”时用到,而且只跟 RPN 和 RoI Head 打交道,Backbone 本身仍然只看…

赫尔默特变化 A=0的情况

🎯 当测站 S 接近 A、B 的连线(近共线布设)时,会导致局部方向 A′B′ 对观测误差极其敏感,从而容易出现 A=0(方向正交) 下面是 完整的、严谨的、可写进论文的数学推导,但我把它讲得简单易懂。✅ 第 1 步:建立…

关于tarjan的一些感性理解

学长博客-图论 0x0 前论: 在了解完tarjan的基本操作以后,发现这个东西十分的抽象,那么这个时候就需要我们进行一些感性理解以方便记忆。 0x1 关于强连通分量 Part-1 关于强连通 说白了就是一个图上任意两个点都能到…

java linux tomcat

你提到的“Java Linux Tomcat”可能是指在 Linux 系统上安装和配置 Tomcat 来运行 Java 应用程序。以下是一些常见的 Linux 系统上安装和管理 Tomcat 的命令和脚本示例,适用于大多数 Linux 发行版(如 Ubuntu、CentOS…

20232411 2024-2025-1 《网络与系统攻防技术》实验六实验报告

1.实验内容 总结一下本周学习内容,不要复制粘贴 2.实验过程 1.准备环境 从Rapid7官网下载官方靶机Metasploitable2,完成前期环境配置。2.前期渗透 (1)主机发现 (2)端口扫描 (3)漏洞扫描 3.Vsftpd源码包后门漏洞(21端…

实用指南:机器人描述文件xacro(urdf扩展)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

代码随想录Day17_二叉树

代码随想录Day17_二叉树今日的四道题目分别是重叠二叉树 在已知二叉树中搜索并返回以给定值为根节点的二叉树 判断二叉树是否是二叉搜索树 在给定数组中重建最大二叉树最大二叉树 题目理解: 给定一个数组,其中最大的…

人工智能之数据分析 numpy:第七章 数组迭代排序筛选

人工智能之数据分析 numpy:第七章 数组迭代排序筛选人工智能之数据分析 numpy 第七章 数组迭代排序筛选@目录人工智能之数据分析 numpy前言一、数组迭代(Iteration)⚠️ 原则:尽量避免显式 for 循环!优先使用向量…

AE文字动画

--本篇导航--字符段落文字动画预设(使用预设、制作自己的预设)文字动画效果参数介绍文字动画例子字符 在使用文字工具(Ctrl+T)输入文字时会自动打开【字符】面板。也可以在菜单栏【窗口】下手动打开。Alt + ←减小…

2025/11/23-Listening to music most days could lower dementia risks for older adults, study suggests

2025/11/23-Listening to music most days could lower dementia risks for older adults, study suggestsListening to music most days could lower dementia risks for older adults, study suggests p { line-heig…