【NumPy进阶】:内存视图、性能优化与高级线性代数

目录

  • 1. 深入理解 NumPy 的内存视图与拷贝
    • 1.1 内存视图(View)
      • 1.1.1 创建视图
      • 1.1.2 视图的特点
    • 1.2 数组拷贝(Copy)
      • 1.2.1 创建拷贝
      • 1.2.2 拷贝的特点
    • 1.3 视图与拷贝的选择
  • 2. NumPy 的优化与性能提升技巧
    • 2.1 向量化操作
      • 示例:向量化替代循环
    • 2.2 使用内存视图而非拷贝
    • 2.3 使用合适的数据类型
    • 2.4 并行计算
    • 2.5 使用 `numexpr` 和 `Numba` 加速
  • 3. 探索 `np.linalg` 模块的高级线性代数运算
    • 3.1 矩阵乘法
    • 3.2 求解线性方程组
    • 3.3 计算矩阵的逆
    • 3.4 特征值和特征向量
    • 3.5 奇异值分解(SVD)
  • 总结


在基础学习的基础上,接下来我们将深入探索 NumPy 的三个重要主题:内存视图与拷贝性能优化技巧高级线性代数运算。通过掌握这些内容,你将能够更高效地处理大型数据、优化计算性能,并在实际应用中使用高级的线性代数工具。


1. 深入理解 NumPy 的内存视图与拷贝

1.1 内存视图(View)

内存视图 是对原始数组数据的引用,而不是数据的副本。通过视图修改数据会影响原始数组。视图不会占用额外的内存,非常适合大数据处理。

NumPy 中的内存视图通常指的就是ndarray 数组类型的切片。

1.1.1 创建视图

import numpy as nparr = np.array([1, 2, 3, 4, 5])# 创建一个视图
view = arr[1:4]
print("View:", view)  # 输出: [2 3 4]# 修改视图
view[0] = 99
print("Original Array:", arr)  # 输出: [ 1 99  3  4  5]

1.1.2 视图的特点

  • 视图和原数组共享相同的内存。
  • 视图的修改会影响原数组。
  • 视图的创建效率高,不涉及数据复制。

1.2 数组拷贝(Copy)

拷贝 是对原始数据的完整复制,修改拷贝不会影响原数组。拷贝适合需要保持原数据不变的场景。

1.2.1 创建拷贝

arr = np.array([1, 2, 3, 4, 5])# 创建一个拷贝
copy = arr[1:4].copy()
print("Copy:", copy)  # 输出: [2 3 4]# 修改拷贝
copy[0] = 99
print("Original Array:", arr)  # 输出: [1 2 3 4 5]

1.2.2 拷贝的特点

  • 拷贝与原数组独立存储。
  • 拷贝的修改不会影响原数组。
  • 创建拷贝需要额外的内存和时间。

1.3 视图与拷贝的选择

  • 使用视图:在内存敏感和数据量大的情况下,使用视图提高效率。
  • 使用拷贝:在需要保护原始数据时,使用拷贝避免数据被意外修改。

2. NumPy 的优化与性能提升技巧

2.1 向量化操作

NumPy 的向量化操作利用底层 C 语言实现的高效算法,避免了 Python 的 for 循环,极大提高了性能。

示例:向量化替代循环

import numpy as np# 使用循环计算平方
arr = np.array([1, 2, 3, 4, 5])
squared_loop = [x**2 for x in arr]# 使用向量化计算平方
squared_vectorized = arr**2print(squared_vectorized)  # 输出: [ 1  4  9 16 25]

2.2 使用内存视图而非拷贝

避免不必要的数据拷贝,使用视图可以节省内存和时间。

arr = np.random.rand(10000)# 使用视图进行切片
view = arr[:5000]

2.3 使用合适的数据类型

选择合适的数据类型可以减少内存消耗和提高计算速度。

# 使用 float32 而不是 float64
arr = np.array([1.2, 3.4, 5.6], dtype=np.float32)

2.4 并行计算

NumPy 在底层对一些操作进行了并行化,例如矩阵乘法、求和等。

A = np.random.rand(1000, 1000)
B = np.random.rand(1000, 1000)# 并行执行矩阵乘法
result = np.dot(A, B)

2.5 使用 numexprNumba 加速

  • numexpr:用于加速复杂的数学表达式。
  • Numba:通过 Just-In-Time (JIT) 编译加速 Python 函数。
import numexpr as ne
import numpy as npa = np.random.rand(1000000)
b = np.random.rand(1000000)# 使用 numexpr 加速计算
result = ne.evaluate("a + b")

详情见此博客:【NumPy】使用numexpr和Numba加速运算


3. 探索 np.linalg 模块的高级线性代数运算

NumPy 的 np.linalg 模块提供了许多高级线性代数功能,包括矩阵分解、求解线性方程组、特征值分解等。

3.1 矩阵乘法

import numpy as npA = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])# 矩阵乘法
result = np.dot(A, B)
print(result)

输出:

[[19 22][43 50]]

3.2 求解线性方程组

求解形如 A x = b Ax = b Ax=b 的线性方程组。

A = np.array([[3, 1], [1, 2]])
b = np.array([9, 8])x = np.linalg.solve(A, b)
print(x)

输出:

[2. 3.]

3.3 计算矩阵的逆

A = np.array([[1, 2], [3, 4]])
inv_A = np.linalg.inv(A)
print(inv_A)

输出:

[[-2.   1. ][ 1.5 -0.5]]

3.4 特征值和特征向量

A = np.array([[4, -2], [1, 1]])# 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(A)
print("Eigenvalues:", eigenvalues)
print("Eigenvectors:\n", eigenvectors)

3.5 奇异值分解(SVD)

A = np.array([[1, 2], [3, 4]])U, S, VT = np.linalg.svd(A)
print("U:\n", U)
print("S:\n", S)
print("VT:\n", VT)

总结

通过深入学习以上内容,你可以更灵活、高效地使用 NumPy:

  1. 内存视图与拷贝:理解何时使用视图、何时使用拷贝。
  2. 性能优化技巧:利用向量化、合适的数据类型和并行计算来提升性能。
  3. 高级线性代数运算:使用 np.linalg 模块解决复杂的线性代数问题。

继续练习这些概念和技巧,将帮助你在数据科学、机器学习和科学计算领域更上一层楼!

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

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

相关文章

HarmonyOS 5.0应用开发——属性动画

【高心星出品】 文章目录 属性动画animateTo属性动画animation属性动画 属性动画 属性接口(以下简称属性)包含尺寸属性、布局属性、位置属性等多种类型,用于控制组件的行为。针对当前界面上的组件,其部分属性(如位置属…

机器学习支持向量机(SVM)算法

一、引言 在当今数据驱动的时代,机器学习算法在各个领域发挥着至关重要的作用。支持向量机(Support Vector Machine,SVM)作为一种强大的监督学习算法,以其在分类和回归任务中的卓越性能而备受瞩目。SVM 具有良好的泛化…

介绍一款docker ui 管理工具

http://vm01:18999/main.html 管理员登陆账号 jinghan/123456 ui启动命令所在文件夹目录 /work/docker/docker-ui 参考链接 DockerUI:一款功能强大的中文Docker可视化管理工具_docker ui-CSDN博客

Motrix WebExtension 使用教程

Motrix WebExtension 使用教程 项目地址:https://gitcode.com/gh_mirrors/mo/motrix-webextension 项目介绍 Motrix WebExtension 是一个浏览器扩展,用于与 Motrix 下载管理器集成。该扩展允许用户通过 Motrix 下载管理器自动下载文件,而不是使用浏览器的原生下载管理器。…

前端(四)css选择器、css的三大特性

css选择器、css的三大特性 文章目录 css选择器、css的三大特性一、css介绍二、css选择器2.1 基本选择器2.2 组合选择器2.3 交集并集选择器2.4序列选择器2.5属性选择器2.6伪类选择器2.7伪元素选择器 三、css三大特性3.1 继承性3.2 层叠性3.3 优先级 一、css介绍 CSS全称为Casca…

《探索视频数字人:开启未来视界的钥匙》

一、引言 1.1视频数字人技术的崛起 在当今科技飞速发展的时代,视频数字人技术如一颗璀璨的新星,正逐渐成为各领域瞩目的焦点。它的出现,犹如一场科技风暴,彻底改变了传统的视频制作方式,为各个行业带来了前所未有的机…

【ETCD】[源码阅读]深度解析 EtcdServer 的 processInternalRaftRequestOnce 方法

在分布式系统中,etcd 的一致性与高效性得益于其强大的 Raft 协议模块。而 processInternalRaftRequestOnce 是 etcd 服务器处理内部 Raft 请求的核心方法之一。本文将从源码角度解析这个方法的逻辑流程,帮助读者更好地理解 etcd 的内部实现。 方法源码 …

免费下载 | 2024算网融合技术与产业白皮书

《2024算网融合技术与产业白皮书(2023年)》的核心内容概括如下: 算网融合发展概述: 各国细化算网战略,指引行业应用创新升级。 算网融合市场快速增长,算力互联成为投资新热点。 算网融合产业模式逐渐成型…

基于卷积神经网络的图像二分类检测模型训练与推理实现教程 | 幽络源

前言 对于本教程,说白了,就是期望能通过一个程序判断一张图片是否为某个物体,或者说判断一张图片是否为某个缺陷。因为本教程是针对二分类问题,因此主要处理 是 与 不是 的问题,比如我的模型是判断一张图片是否为苹果…

安全见闻全解析

跟随 泷羽sec团队学习 声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及…

代码随想录-算法训练营-番外(图论02:岛屿数量,岛屿的最大面积)

day02 图论part02 今日任务:岛屿数量,岛屿的最大面积 都是一个模子套出来的 https://programmercarl.com/kamacoder/0099.岛屿的数量深搜.html#思路往日任务: day01 图论part01 今日任务:图论理论基础/所有可到达的路径 代码随想录图论视频部分还没更新 https://programmercar…

RabbitMQ个人理解与基本使用

目录 一. 作用: 二. RabbitMQ的5中队列模式: 1. 简单模式 2. Work模式 3. 发布/订阅模式 4. 路由模式 5. 主题模式 三. 消息持久化: 消息过期时间 ACK应答 四. 同步接收和异步接收: 应用场景 五. 基本使用 &#xff…

前端怎么预览pdf

1.背景 后台返回了一个在线的pdf地址,需要我这边去做一个pdf的预览(需求1),并且支持配置是否可以下载(需求2),需要在当前页就能预览(需求3)。之前我写过一篇预览pdf的文…

Python 参数配置使用 XML 文件的教程:轻松管理你的项目配置

Python 参数配置使用 XML 文件的教程:轻松管理你的项目配置 一句话总结:当配置项存储在外部文件(如 XML、JSON)时,修改配置无需重新编译和发布代码。通过更新 XML 文件即可调整参数,无需更改源代码&#xf…

解决 MySQL 启动失败与大小写问题,重置数据库

技术文档:解决 MySQL 启动失败与大小写问题,重置数据库 1. 问题背景 在使用 MySQL 时,可能遇到以下问题: MySQL 启动失败,日志显示 “permission denied” 或 “Can’t create directory” 错误。MySQL 在修改配置文…

python webdriver-manager 实现selenium 免下载安装webdriver

python webdriver-manager 实现selenium 免下载安装webdriver selenium在自动化测试中,通常需要使用浏览器驱动来与浏览器进行交互。然而,手动下载、安装、以及管理这些驱动非常麻烦,尤其是当驱动版本频繁更新时。为此,webdriver-manager库提供了一个极简的方案,自动帮我…

滑动窗口算法专题

滑动窗口简介 滑动窗口就是利用单调性,配合同向双指针来优化暴力枚举的一种算法。 该算法主要有四个步骤 1. 先进进窗口 2. 判断条件,后续根据条件来判断是出窗口还是进窗口 3. 出窗口 4.更新结果,更新结果这个步骤是不确定的&#xff0c…

C# 中的Task

文章目录 前言一、Task 的基本概念二、创建 Task使用异步方法使用 Task.Run 方法 三、等待 Task 完成使用 await 关键字使用 Task.Wait 方法 四、处理 Task 的异常使用 try-catch 块使用 Task.Exception 属性 五、Task 的延续使用 ContinueWith 方法使用 await 关键字和异步方法…

【AIGC】如何高效使用ChatGPT挖掘AI最大潜能?26个Prompt提问秘诀帮你提升300%效率的!

还记得第一次使用ChatGPT时,那种既兴奋又困惑的心情吗?我是从一个对AI一知半解的普通用户,逐步成长为现在的“ChatGPT大神”。这一过程并非一蹴而就,而是通过不断的探索和实践,掌握了一系列高效使用的技巧。今天&#…

浩辰CAD教程004:柱梁板

文章目录 柱梁板标准柱角柱构造柱柱齐墙边绘制梁绘制楼板 柱梁板 标准柱 绘制标准柱: ①:点选插入柱子②:沿着一根轴线布置柱子③:指定的矩形区域内的轴线交点插入柱子 替换现有柱子:选择替换之后的柱子形状&#x…