NumPy - 线性代数
NumPy 中的线性代数
线性代数是数学的一个分支,它处理向量、矩阵和线性变换。
NumPy 包包含 numpy.linalg 模块,该模块提供了线性代数所需的所有功能。下表列出了该模块中的一些重要函数。
序号 | 函数 &说明 |
---|---|
1 |
dot
两个数组的点积 |
2 |
vdot
两个向量的点积 |
3 |
inner
两个数组的内积 |
4 |
matmul
两个数组的矩阵乘积 |
5 |
行列式
计算数组的行列式 |
6 |
solve
求解线性矩阵方程 |
7 |
inv
求矩阵 |
创建矩阵
在 NumPy 中,我们可以使用数组创建矩阵。矩阵只是二维数组,可以使用 np.array() 函数创建。您可以将矩阵的元素指定为嵌套列表。
示例
以下是一个基本示例,我们创建一个由两行三列组成的矩阵 -
import numpy as np # 创建一个 2x3 矩阵 matrix = np.array([[1, 2, 3], [4, 5, 6]]) print("Matrix: ", matrix)
以下是得到的输出 -
矩阵: [[1 2 3] [4 5 6]]
矩阵运算
矩阵运算是线性代数的基础,涉及对矩阵进行算术运算。在 NumPy 中,您可以轻松执行矩阵的加、减、乘和转置运算。
矩阵加法和减法
矩阵加法和减法是逐元素执行的。这意味着每个矩阵中的相应元素会被加上或减去。执行这些运算时,两个矩阵必须具有相同的形状。
示例
在下面的示例中,我们使用两个 2x2 NumPy 数组 A 和 B 执行逐元素矩阵加法和减法 -
import numpy as np A = np.array([[1, 2], [3, 4]]) B = np.array([[5, 6], [7, 8]]) # 矩阵加法 C = A + B print("矩阵加法: ", C) # 矩阵减法 D = A - B print("矩阵减法: ", D)
这将产生以下结果 -
矩阵加法: [[ 6 8] [10 12]] 矩阵减法: [[-4 -4] [-4 -4]]
矩阵乘法
矩阵乘法可以使用 @ 运算符或 np.dot() 函数完成。与元素乘法不同,矩阵乘法涉及对行和列的乘积求和。
示例
这里,我们使用 @ 运算符和 np.dot() 函数对两个 2x2 NumPy 数组 A 和 B 执行矩阵乘法 -
import numpy as np A = np.array([[1, 2], [3, 4]]) B = np.array([[5, 6], [7, 8]]) # 矩阵乘法 C = A @ B print("使用 @ 的矩阵乘法: ", C) D = np.dot(A, B) print("使用np.dot(): ", D)
以下是上述代码的输出 -
使用 @ 进行矩阵乘法: [[19 22] [43 50]] 使用 np.dot() 进行矩阵乘法: [[19 22] [43 50]]
矩阵转置
矩阵的转置是通过沿对角线翻转矩阵得到的,实际上是将行与列交换。这可以使用 .T 属性实现。
示例
在这里,我们转置一个 2x2 的 NumPy 数组 A 以获得其转置 AT −
import numpy as np A = np.array([[1, 2], [3, 4]]) # 转置矩阵 A_T = A.T print("转置 A: ", A_T)
得到的输出如下所示 −
转置 A: [[1 3] [2 4]]
行列式 &逆
行列式指示矩阵是否可逆(非奇异)。如果矩阵的行列式非零,则该矩阵可逆。相反,如果行列式为零,则该矩阵为奇异矩阵,不可逆。它也用于 -
- 解线性方程。
- 改变积分中的变量。
- 计算面积和体积。
- 定义方阵的特征多项式。
矩阵的逆是指与原矩阵相乘后得到单位矩阵的矩阵。
A X A-1 = A-1 = I
NumPy 提供了各种函数来计算矩阵的行列式和逆。
计算行列式
我们可以使用 linalg.det() 函数计算矩阵的行列式。它内部使用 LAPACK 例程来计算行列式(通过 LU 分解)。
示例
在下面的示例中,我们使用 np.linalg.det() 函数计算 2x2 NumPy 数组 A 的行列式 -
import numpy as np A = np.array([[1, 2], [3, 4]]) # 矩阵的行列式 det = np.linalg.det(A) print("A 的行列式:", det)
执行上述代码后,我们得到以下输出 -
A 的行列式: -2.00000000000000004
计算逆矩阵
我们可以使用 linalg.inv() 函数计算矩阵的逆矩阵。
示例
这里,我们使用 np.linalg.inv() 函数计算 2x2 NumPy 数组 A 的逆矩阵 -
import numpy as np A = np.array([[1, 2], [3, 4]]) # 矩阵的逆 A_inv = np.linalg.inv(A) print("A 的逆: ", A_inv)
结果如下 −
A 的逆: [[-2. 1. ] [ 1.5 -0.5]]
特征值和特征向量
特征值和特征向量是理解线性变换的基础。它们可以使用 np.linalg.eig() 函数计算。
特征值表示变换的幅度,而特征向量表示方向。
示例
在下面的示例中,我们使用 np.linalg.eig() 函数计算 2x2 NumPy 数组 A 的特征值和特征向量。 A −
import numpy as np A = np.array([[1, 2], [3, 4]]) # 计算特征值和特征向量 eigenvalues, eigenvectors = np.linalg.eig(A) print("特征值:",特征值) print("特征向量: ", 特征向量)
我们得到如下所示的输出 −
特征值:[-0.37228132 5.37228132] 特征向量: [[-0.82456484 -0.41597356] [ 0.56576746 -0.90937671]]
求解线性方程组
在 Numpy 中,可以使用 np.linalg.solve() 函数求解线性方程组。此函数用于查找满足矩阵方程表示的线性方程的变量值 -
Ax = b
其中,A 表示矩阵,b 表示向量。
示例
在此示例中,我们正在求解由矩阵方程 Ax=b 表示的线性方程组,其中 A 是一个 2x2 矩阵,b 是一个向量。我们使用 np.linalg.solve() 函数计算满足以下方程的 x 值:-
import numpy as np A = np.array([[3, 1], [1, 2]]) b = np.array([9, 8]) # 求解线性系统 Ax = b x = np.linalg.solve(A, b) print("线性系统的解:", x)
以下是得到的输出:-
线性系统的解:[2. 3.]
奇异值分解 (SVD)
SVD 是将矩阵分解为三个矩阵:U(左奇异向量)、S(奇异值)和 V(右奇异向量)。它在各种应用中都很有用,包括信号处理和统计。
您可以使用 NumPy 中的 np.linalg.svd() 函数执行 SVD。
示例
在下面的示例中,我们对 2x2 矩阵 A 执行奇异值分解 (SVD),将其分解为三个分量:U、S 和 V -
import numpy as np A = np.array([[1, 2], [3, 4]]) # 执行 SVD U, S, V = np.linalg.svd(A) print("U 矩阵: ", U) print("Sigma 值:", S) print("V 矩阵: ", V)
这将产生以下结果 −
U 矩阵: [[-0.40455358 -0.9145143 ] [-0.9145143 0.40455358]] Sigma 值:[5.4649857 0.36596619] V 矩阵: [[-0.57604844 -0.81741556] [ 0.81741556 -0.57604844]]
范数和条件
范数测量向量和矩阵的大小或长度,有助于量化其量级。条件数值表示矩阵解对其输入变化的敏感度,从而表明其数值求解的精度。
计算范数
范数测量向量和矩阵的大小或长度。我们可以使用 NumPy 的 linalg.norm() 函数来计算不同类型的范数,例如 Frobenius 范数和欧几里得范数。
示例
在下面的例子中,我们计算 2x2 矩阵 A 的 Frobenius 范数,该范数衡量了矩阵的整体大小,类似于向量的欧几里得范数。
我们还计算三维向量的 L2 范数(欧几里得范数),该范数量化了向量在空间中的长度 -
import numpy as np A = np.array([[1, 2], [3, 4]]) # Frobenius 范数 norm = np.linalg.norm(A, 'fro') print("A 的 Frobenius 范数:", norm) # L2 范数(欧几里得范数) vector = np.array([1, 2, 3]) l2_norm = np.linalg.norm(vector) print("向量的 L2 范数:", l2_norm)
以下是上述代码的输出 -
A 的 Frobenius 范数:5.477225575051661 向量的 L2 范数:3.7416573867739413
计算条件
矩阵的条件数衡量线性系统解对数据误差的敏感程度。
可以使用 NumPy 计算linalg.cond() 函数。条件数越高,矩阵越接近奇异矩阵,精确求解线性方程组就越困难。
示例
此处,我们计算 2x2 矩阵 A 的条件数 −
import numpy as np A = np.array([[1, 2], [3, 4]]) # 条件数 cond = np.linalg.cond(A) print("A 的条件数:", cond)
输出结果如下 −
A 的条件数:14.933034373659268