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

ops/2024/12/16 13:40:06/

目录

  • 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 创建视图

python">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 创建拷贝

python">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 循环,极大提高了性能。

示例:向量化替代循环

python">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 使用内存视图而非拷贝

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

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

2.3 使用合适的数据类型

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

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

2.4 并行计算

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

python">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 函数。
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 矩阵乘法

python">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 的线性方程组。

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

输出:

[2. 3.]

3.3 计算矩阵的逆

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

输出:

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

3.4 特征值和特征向量

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

3.5 奇异值分解(SVD)

python">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.ppmy.cn/ops/142376.html

相关文章

Python 命令搭建 Https的服务器

要使用Python命令行搭建HTTPS服务器,您可以使用http.server模块(在Python 3.x中可用),并结合ssl模块来创建安全的HTTPS连接。以下是一个简单的步骤指南: 准备证书: 在搭建HTTPS服务器之前,您需要…

ORB-SLAM2源码学习:Tracking.cc:Tracking::TrackWithMotionModel恒速模型跟踪

前言 什么是恒速跟踪模型? 两个图像帧之间一般只有几十毫秒的时间,在这么短的时间内,可以做出如下合理的假设: 假设相机在短时间内的运动速度是恒定的,用之前帧的位姿和速度来预测当前帧的相机位姿,我们…

第三十八天|动态规划|背包问题总结,322. 零钱兑换,279.完全平方数,139.单词拆分,多重背包

目录 322. 零钱兑换 279.完全平方数 先遍历物品, 再遍历背包(好理解一点) 先遍历背包, 再遍历物品 139.单词拆分 方法1:完全背包 方法2:完全背包2 方法3:回溯法记忆化 多重背包 背包问题总结 背包递推公式 …

MySQL 性能调优:打造高效数据库

SQL 语句层面的性能调优策略 合理选择字段属性 在创建 MySQL 表时,为了获取更好的性能,选择合适的字段属性至关重要。 首先,要依据实际情况合理设置字段的类型及宽度。例如,对于像手机号码这类固定长度为 11 位的字段&#xff…

我们来对接蓝凌OA --报文格式

题记 数智化办公专家、国家高新技术企业、知识管理国家标准制定者、信创供应商10强…等等,这些和咱们有关系吗!!不好意思,走错片场了,刚和项目经理在甲方那边吹牛B想想刚刚的大饼,看看支付宝余额&#xff…

Selenium WebDriver:自动化网页交互的利器

Selenium WebDriver:自动化网页交互的利器 在当今快速发展的Web开发领域,自动化测试已经成为确保应用程序质量和用户体验的重要手段。Selenium WebDriver,作为Selenium工具包中的核心组件,正是这一领域的佼佼者。本文将详细介绍S…

ARM/Linux嵌入式面经(五五):未岚大陆

文章目录 0、项目中既有flash又有E2,为什么不只使用一个?问题回答:1、uart通信与i2c通讯的硬件区别;2、说说你理解的pid算法;问题回答3、串口转usb怎么实现的?问题回答:4、软件采集的adc数据有没有滤波;问题回答5、是否使用过boot?你觉得使用boot的注意事项是什么?问…

FPGA的EDA工具的测试方法

一:概述 都说EDA工具很难(芯片设计不可缺少的工具),目前我国正在举国之力来发展它(因为之前我国一直没在这个领域做基础研究,一直是使用者,所以,被美国拉开了很大的差距&#xff09…