- NumPy 教程
- NumPy - 首页
- NumPy - 简介
- NumPy - 环境
- NumPy 数组
- NumPy - Ndarray 对象
- NumPy - 数据类型
- NumPy 创建和操作数组
- NumPy - 数组创建例程
- NumPy - 数组操作
- NumPy - 从现有数据创建数组
- NumPy - 从数值范围创建数组
- NumPy - 迭代数组
- NumPy - 重塑数组
- NumPy - 连接数组
- NumPy - 堆叠数组
- NumPy - 分割数组
- NumPy - 展平数组
- NumPy - 转置数组
- NumPy 索引和切片
- NumPy - 索引和切片
- NumPy - 高级索引
- NumPy 数组属性和运算
- NumPy - 数组属性
- NumPy - 数组形状
- NumPy - 数组大小
- NumPy - 数组步幅
- NumPy - 数组元素大小
- NumPy - 广播
- NumPy - 算术运算
- NumPy - 数组加法
- NumPy - 数组减法
- NumPy - 数组乘法
- NumPy - 数组除法
- NumPy 高级数组运算
- NumPy - 交换数组轴
- NumPy - 字节交换
- NumPy - 副本和视图
- NumPy - 元素级数组比较
- NumPy - 过滤数组
- NumPy - 连接数组
- NumPy - 排序、搜索和计数函数
- NumPy - 搜索数组
- NumPy - 数组的并集
- NumPy - 查找唯一行
- NumPy - 创建日期时间数组
- NumPy - 二元运算符
- NumPy - 字符串函数
- NumPy - 数学函数
- NumPy - 统计函数
- NumPy - 矩阵库
- NumPy - 线性代数
- NumPy - Matplotlib
- NumPy - 使用 Matplotlib 绘制直方图
- NumPy - NumPy 的 I/O
- NumPy 排序和高级操作
- NumPy - 排序数组
- NumPy - 沿轴排序
- NumPy - 使用花式索引排序
- NumPy - 结构化数组
- NumPy - 创建结构化数组
- NumPy - 操作结构化数组
- NumPy - 字段访问
- NumPy - 记录数组
- Numpy - 加载数组
- Numpy - 保存数组
- NumPy - 将值追加到数组
- NumPy - 交换数组的列
- NumPy - 向数组插入轴
- NumPy 处理缺失数据
- NumPy - 处理缺失数据
- NumPy - 识别缺失值
- NumPy - 删除缺失数据
- NumPy - 填充缺失数据
- NumPy 性能优化
- NumPy - 使用数组进行性能优化
- NumPy - 使用数组进行矢量化
- NumPy - 数组的内存布局
- Numpy 线性代数
- NumPy - 线性代数
- NumPy - 矩阵库
- NumPy - 矩阵加法
- NumPy - 矩阵减法
- NumPy - 矩阵乘法
- NumPy - 元素级矩阵运算
- NumPy - 点积
- NumPy - 矩阵求逆
- NumPy - 行列式计算
- NumPy - 特征值
- NumPy - 特征向量
- NumPy - 奇异值分解
- NumPy - 求解线性方程组
- NumPy - 矩阵范数
- NumPy 元素级矩阵运算
- NumPy - 求和
- NumPy - 求平均值
- NumPy - 求中位数
- NumPy - 求最小值
- NumPy - 求最大值
- NumPy 集合运算
- NumPy - 唯一元素
- NumPy - 交集
- NumPy - 并集
- NumPy - 差集
- NumPy 有用资源
- NumPy 编译器
- NumPy - 快速指南
- NumPy - 有用资源
- NumPy - 讨论
NumPy - 线性代数
NumPy 中的线性代数
线性代数是数学的一个分支,它处理向量、矩阵和线性变换。
NumPy 包含 **numpy.linalg** 模块,该模块提供了线性代数所需的所有功能。下表描述了此模块中的一些重要函数。
| 序号 | 函数和描述 |
|---|---|
| 1 | dot
两个数组的点积 |
| 2 | vdot
两个向量的点积 |
| 3 | inner
两个数组的内积 |
| 4 | matmul
两个数组的矩阵积 |
| 5 | determinant
计算数组的行列式 |
| 6 | solve
求解线性矩阵方程 |
| 7 | inv
查找矩阵的乘法逆矩阵 |
创建矩阵
在 NumPy 中,我们可以使用数组创建矩阵。矩阵只是二维数组,可以使用 np.array() 函数创建。您可以将矩阵的元素指定为嵌套列表。
示例
以下是一个基本示例,其中我们创建了一个包含两行三列的矩阵:
import numpy as np
# Creating a 2x3 matrix
matrix = np.array([[1, 2, 3], [4, 5, 6]])
print("Matrix:\n", 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]])
# Matrix Addition
C = A + B
print("Matrix Addition:\n", C)
# Matrix Subtraction
D = A - B
print("Matrix Subtraction:\n", D)
这将产生以下结果:
Matrix Addition: [[ 6 8] [10 12]] Matrix Subtraction: [[-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]])
# Matrix Multiplication
C = A @ B
print("Matrix Multiplication with @:\n", C)
D = np.dot(A, B)
print("Matrix Multiplication with np.dot():\n", D)
以下为上述代码的输出:
Matrix Multiplication with @: [[19 22] [43 50]] Matrix Multiplication with np.dot(): [[19 22] [43 50]]
矩阵转置
矩阵的转置是通过沿其对角线翻转获得的,有效地将行与列交换。这可以使用 **.T** 属性实现。
示例
在这里,我们转置一个 2x2 NumPy 数组 **A** 以获得其转置 AT:
import numpy as np
A = np.array([[1, 2], [3, 4]])
# Transposing the matrix
A_T = A.T
print("Transpose of A:\n", A_T)
获得的输出如下所示:
Transpose of 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]])
# Determinant of the matrix
det = np.linalg.det(A)
print("Determinant of A:", det)
执行上述代码后,我们得到以下输出:
Determinant of A: -2.0000000000000004
计算逆矩阵
我们可以使用 **linalg.inv()** 函数计算矩阵的逆矩阵。
示例
这里,我们使用 np.linalg.inv() 函数计算 2x2 NumPy 数组 **A** 的逆矩阵:
import numpy as np
A = np.array([[1, 2], [3, 4]])
# Inverse of the matrix
A_inv = np.linalg.inv(A)
print("Inverse of A:\n", A_inv)
产生的结果如下:
Inverse of A: [[-2. 1. ] [ 1.5 -0.5]]
特征值和特征向量
特征值和特征向量对于理解线性变换至关重要。可以使用 **np.linalg.eig()** 函数计算它们。
特征值表示变换的大小,而特征向量表示方向。
示例
在下面所示的示例中,我们使用 np.linalg.eig() 函数计算 2x2 NumPy 数组 **A** 的特征值和特征向量:
import numpy as np
A = np.array([[1, 2], [3, 4]])
# Computing eigenvalues and eigenvectors
eigenvalues, eigenvectors = np.linalg.eig(A)
print("Eigenvalues:", eigenvalues)
print("Eigenvectors:\n", eigenvectors)
我们得到如下所示的输出:
Eigenvalues: [-0.37228132 5.37228132] Eigenvectors: [[-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])
# Solving the linear system Ax = b
x = np.linalg.solve(A, b)
print("Solution of the linear system:", x)
获得以下输出:
Solution of the linear system: [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]])
# Performing SVD
U, S, V = np.linalg.svd(A)
print("U matrix:\n", U)
print("Sigma values:", S)
print("V matrix:\n", V)
这将产生以下结果:
U matrix: [[-0.40455358 -0.9145143 ] [-0.9145143 0.40455358]] Sigma values: [5.4649857 0.36596619] V matrix: [[-0.57604844 -0.81741556] [ 0.81741556 -0.57604844]]
范数和条件数
**范数** 测量向量和矩阵的大小或长度,有助于量化其大小。**条件数** 指示矩阵的解对其输入变化的敏感程度,表明它在数值上可以解决的程度。
计算范数
范数测量向量和矩阵的大小或长度。我们可以使用 NumPy **linalg.norm()** 函数计算不同类型的范数,例如 Frobenius 范数和欧几里得范数。
示例
在下面的示例中,我们正在计算 2x2 矩阵 **A** 的 Frobenius 范数,它提供了其整体大小的度量,类似于向量的欧几里得范数。
我们还计算了 3D 向量的 L2 范数(欧几里得范数),它量化了其在空间中的长度:
import numpy as np
A = np.array([[1, 2], [3, 4]])
# Frobenius norm
norm = np.linalg.norm(A, 'fro')
print("Frobenius norm of A:", norm)
# L2 norm (Euclidean norm)
vector = np.array([1, 2, 3])
l2_norm = np.linalg.norm(vector)
print("L2 norm of vector:", l2_norm)
以下为上述代码的输出:
Frobenius norm of A: 5.477225575051661 L2 norm of vector: 3.7416573867739413
计算条件数
矩阵的条件数衡量线性系统的解对数据中误差的敏感程度。
它可以使用 NumPy **linalg.cond()** 函数计算。较高的条件数表示矩阵接近奇异,这使得准确求解线性方程组更具挑战性。
示例
这里,我们正在计算 2x2 矩阵 **A** 的条件数:
import numpy as np
A = np.array([[1, 2], [3, 4]])
# Condition number
cond = np.linalg.cond(A)
print("Condition number of A:", cond)
获得的输出如下所示:
Condition number of A: 14.933034373659268