第六章:NumPy 线性代数运算


文档摘要

第六章:NumPy 线性代数运算 第六章:NumPy 线性代数运算 NumPy 提供了强大的线性代数运算功能,使得在 Python 中进行矩阵运算、向量运算、解线性方程组等任务变得简单高效。本章将深入探讨 NumPy 线性代数模块( ),介绍常用的线性代数函数及其应用。 6.1 NumPy 线性代数模块简介 NumPy 的 模块包含了执行线性代数运算的各种函数。在使用这些函数之前,需要确保已经导入 NumPy 库: 6.2 矩阵和向量的创建 在进行线性代数运算之前,首先需要创建矩阵和向量。NumPy 数组是表示矩阵和向量的理想选择。 6.3 矩阵乘法 矩阵乘法是线性代数中最基本的操作之一。NumPy 提供了两种方法进行矩阵乘法: 和 运算符。 对于向量, 可以计算向量的点积(内积)。 6.

第六章:NumPy 线性代数运算

第六章:NumPy 线性代数运算

NumPy 提供了强大的线性代数运算功能,使得在 Python 中进行矩阵运算、向量运算、解线性方程组等任务变得简单高效。本章将深入探讨 NumPy 线性代数模块(numpy.linalg),介绍常用的线性代数函数及其应用。

6.1 NumPy 线性代数模块简介

NumPy 的 numpy.linalg 模块包含了执行线性代数运算的各种函数。在使用这些函数之前,需要确保已经导入 NumPy 库:

import numpy as np

6.2 矩阵和向量的创建

在进行线性代数运算之前,首先需要创建矩阵和向量。NumPy 数组是表示矩阵和向量的理想选择。

# 创建矩阵 matrix_a = np.array([[1, 2], [3, 4]]) matrix_b = np.array([[5, 6], [7, 8]]) # 创建向量 vector_x = np.array([1, 2]) vector_y = np.array([3, 4]) print("Matrix A:\n", matrix_a) print("Matrix B:\n", matrix_b) print("Vector X:\n", vector_x) print("Vector Y:\n", vector_y)

6.3 矩阵乘法

矩阵乘法是线性代数中最基本的操作之一。NumPy 提供了两种方法进行矩阵乘法:np.dot()@ 运算符。

# 使用 np.dot() matrix_product_dot = np.dot(matrix_a, matrix_b) # 使用 @ 运算符 (Python 3.5+) matrix_product_at = matrix_a @ matrix_b print("Matrix Product (dot):\n", matrix_product_dot) print("Matrix Product (@):\n", matrix_product_at)

对于向量,np.dot() 可以计算向量的点积(内积)。

# 向量点积 vector_dot_product = np.dot(vector_x, vector_y) print("Vector Dot Product:\n", vector_dot_product)

6.4 矩阵转置

矩阵转置是指将矩阵的行和列互换。NumPy 使用 .T 属性或 np.transpose() 函数进行矩阵转置。

# 使用 .T 属性 matrix_a_transpose_T = matrix_a.T # 使用 np.transpose() 函数 matrix_a_transpose_func = np.transpose(matrix_a) print("Matrix A Transpose (.T):\n", matrix_a_transpose_T) print("Matrix A Transpose (np.transpose()):\n", matrix_a_transpose_func)

6.5 矩阵的行列式

矩阵的行列式是一个标量值,它提供了关于矩阵性质的重要信息,例如矩阵是否可逆。NumPy 使用 np.linalg.det() 函数计算矩阵的行列式。

# 计算矩阵 A 的行列式 determinant_a = np.linalg.det(matrix_a) print("Determinant of Matrix A:\n", determinant_a)

6.6 矩阵的逆

只有方阵才可能存在逆矩阵。如果一个矩阵的行列式不为零,则该矩阵可逆。NumPy 使用 np.linalg.inv() 函数计算矩阵的逆。

# 计算矩阵 A 的逆 try: matrix_a_inverse = np.linalg.inv(matrix_a) print("Inverse of Matrix A:\n", matrix_a_inverse) except np.linalg.LinAlgError: print("Matrix A is singular (non-invertible).")

6.7 解线性方程组

NumPy 可以使用 np.linalg.solve() 函数解线性方程组。例如,对于方程组 Ax = b,其中 A 是系数矩阵,b 是常数向量,x 是未知向量,可以使用以下代码求解:

# 定义系数矩阵 A 和常数向量 b A = np.array([[2, 1], [1, 3]]) b = np.array([5, 8]) # 解线性方程组 Ax = b x = np.linalg.solve(A, b) print("Solution of Ax = b:\n", x)

6.8 特征值和特征向量

特征值和特征向量是线性代数中的重要概念。对于一个方阵 A,如果存在一个非零向量 v 和一个标量 λ,使得 Av = λv,则 λ 是 A 的一个特征值,v 是对应的特征向量。NumPy 使用 np.linalg.eig() 函数计算矩阵的特征值和特征向量。

# 计算矩阵 A 的特征值和特征向量 eigenvalues, eigenvectors = np.linalg.eig(matrix_a) print("Eigenvalues of Matrix A:\n", eigenvalues) print("Eigenvectors of Matrix A:\n", eigenvectors)

6.9 奇异值分解 (SVD)

奇异值分解 (SVD) 是一种重要的矩阵分解方法,可以将一个矩阵分解为三个矩阵的乘积:A = UΣVT,其中 U 和 V 是正交矩阵,Σ 是一个对角矩阵,其对角线上的元素是 A 的奇异值。NumPy 使用 np.linalg.svd() 函数进行奇异值分解。

# 定义一个矩阵 A = np.array([[1, 2], [3, 4], [5, 6]]) # 进行奇异值分解 U, S, V = np.linalg.svd(A) print("U:\n", U) print("S:\n", S) print("V:\n", V)

6.10 范数

矩阵和向量的范数是衡量其大小的一种方式。NumPy 使用 np.linalg.norm() 函数计算范数。

# 计算向量 x 的 L2 范数(欧几里得范数) vector_x_norm = np.linalg.norm(vector_x) print("L2 Norm of Vector X:\n", vector_x_norm) # 计算矩阵 A 的 Frobenius 范数 matrix_a_norm = np.linalg.norm(matrix_a) print("Frobenius Norm of Matrix A:\n", matrix_a_norm)

6.11 代码示例:图像压缩

SVD 可以用于图像压缩。通过保留较大的奇异值,我们可以近似地重构原始图像,从而实现压缩。

import numpy as np from PIL import Image import matplotlib.pyplot as plt def compress_image(image_path, k): """ 使用 SVD 压缩图像。 Args: image_path (str): 图像文件路径。 k (int): 保留的奇异值数量。 """ # 读取图像并转换为灰度图 img = Image.open(image_path).convert('L') img_array = np.array(img) # 进行奇异值分解 U, S, V = np.linalg.svd(img_array) # 保留前 k 个奇异值 S_k = np.diag(S[:k]) U_k = U[:, :k] V_k = V[:k, :] # 重构图像 compressed_img_array = U_k @ S_k @ V_k # 将图像数组转换为图像 compressed_img = Image.fromarray(compressed_img_array.astype(np.uint8)) return compressed_img # 示例用法 image_path = "path/to/your/image.jpg" # 替换为你的图像路径 k = 50 # 保留前 50 个奇异值 compressed_image = compress_image(image_path, k) # 显示原始图像和压缩后的图像 img = Image.open(image_path).convert('L') plt.figure(figsize=(10, 5)) plt.subplot(1, 2, 1) plt.imshow(img, cmap='gray') plt.title("Original Image") plt.subplot(1, 2, 2) plt.imshow(compressed_image, cmap='gray') plt.title(f"Compressed Image (k={k})") plt.show()

6.12 可视化:线性变换

以下是一个使用 mermaid 图来可视化线性变换的示例。假设我们有一个二维向量 v,和一个变换矩阵 A。 线性变换 Av 可以被可视化为向量 v 在经过矩阵 A 变换后的结果。

解释:

  • A [Vector v (before transformation)]: 表示原始向量 v,它是线性变换的输入。

  • B (Apply Matrix A): 表示应用变换矩阵 A 到向量 v 的过程。

  • C [Vector v' (after transformation)]: 表示变换后的向量 v',它是线性变换的输出。

这个图简单地展示了线性变换的概念:一个向量通过与一个矩阵相乘,变换到另一个向量。

6.13 总结

NumPy 的 numpy.linalg 模块提供了丰富的线性代数运算功能,涵盖了矩阵乘法、转置、行列式、逆、解线性方程组、特征值分解、奇异值分解等常用操作。掌握这些函数可以帮助我们高效地进行线性代数计算,解决实际问题,如图像压缩、数据分析等。希望本章内容能够帮助你更好地理解和应用 NumPy 的线性代数功能。


发布者: 作者: 转发
评论区 (0)
U