NumPy 是线性代数领域中高效的工具。它可以帮助完成矩阵运算和方程求解。本文将介绍 NumPy 中用于线性代数的常用函数。
矩阵乘法
矩阵乘法会根据两个矩阵生成一个新矩阵。具体做法是将第一个矩阵的每一行与第二个矩阵的每一列相乘,并将乘积相加,得到新矩阵的对应元素。
# 定义矩阵
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
# 矩阵乘法
C = np.dot(A, B)
print("矩阵乘法结果:\n", C)
# 输出结果:
# [[19 22]
# [43 50]]
矩阵求逆
将一个矩阵与其逆矩阵相乘,可以得到单位矩阵。矩阵求逆常用于求解线性方程组。只有方阵且非奇异矩阵才有逆矩阵。
# 定义方阵
A = np.array([[1, 2], [3, 4]])
# 矩阵求逆
A_inv = np.linalg.inv(A)
print("矩阵的逆:\n", A_inv)
# 输出结果:
# [[-2. 1. ]
# [ 1.5 -0.5]]
矩阵行列式
矩阵的行列式是由矩阵计算出的一个数值。它可以判断矩阵是否可逆。行列式的计算规则依赖于矩阵的大小。
# 定义方阵
A = np.array([[1, 2], [3, 4]])
# 计算行列式
det_A = np.linalg.det(A)
print("矩阵的行列式:", det_A)
# 输出结果: -2.0000000000000004
矩阵迹(Trace)
矩阵的迹是对角线元素之和,仅适用于方阵。迹的值是一个单一的数。
# 定义方阵
A = np.array([[1, 2], [3, 4]])
# 计算迹
trace_A = np.trace(A)
print("矩阵的迹:", trace_A)
# 输出结果: 5
矩阵转置
矩阵转置是指将矩阵沿主对角线翻转,将行和列的位置互换。
# 定义矩阵
A = np.array([[1, 2, 3], [4, 5, 6]])
# 计算转置
A_T = np.transpose(A)
print("矩阵的转置:\n", A_T)
# 输出结果:
# [[1 4]
# [2 5]
# [3 6]]
特征值与特征向量
特征值表示特征向量在变换中的缩放比例。特征向量在该变换下方向不变。
# 定义方阵
A = np.array([[1, 2], [3, 4]])
# 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(A)
print("特征值:", eigenvalues)
print("特征向量:\n", eigenvectors)
# 输出结果:
# 特征值: [-0.37228132 5.37228132]
# 特征向量:
# [[-0.82456484 -0.41597356]
# [ 0.56576746 -0.90937671]]
LU 分解
LU 分解将一个矩阵分解为下三角矩阵(L)和上三角矩阵(U)的乘积。常用于求解线性最小二乘问题和特征值问题。
import numpy as np
from scipy.linalg import lu
# 定义矩阵
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# LU分解
P, L, U = lu(A)
# 显示结果
print("LU分解结果:")
print("P矩阵:\n", P)
print("L矩阵:\n", L)
print("U矩阵:\n", U)
# 输出结果:
# P矩阵:
# [[0. 1. 0.]
# [0. 0. 1.]
# [1. 0. 0.]]
# L矩阵:
# [[ 1. 0. 0. ]
# [ 0.33333333 1. 0. ]
# [ 0.66666667 -0.5 1. ]]
# U矩阵:
# [[ 7. 8. 9. ]
# [ 0. 0.33333333 0.66666667]
# [ 0. 0. 0. ]]
QR分解
QR 分解将一个矩阵分解为正交矩阵(Q)和上三角矩阵(R)。常用于最小二乘法和特征值计算。
import numpy as np
from scipy.linalg import qr
# 定义矩阵
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# QR分解
Q, R = qr(A)
# 显示结果
print("QR分解结果:")
print("Q矩阵:\n", Q)
print("R矩阵:\n", R)
# 输出结果:
# Q矩阵:
# [[-0.26726124 -0.78583024 0.55708601]
# [-0.53452248 -0.08675134 -0.83125484]
# [-0.80178373 0.6172134 0.08122978]]
# R矩阵:
# [[-7.41619849 -8.48528137 -9.55445709]
# [ 0. -0.90453403 -1.80906806]
# [ 0. 0. 0. ]]
奇异值分解(SVD)
SVD 将一个矩阵分解为三个矩阵:U、Σ 和 V*。U 和 V* 是正交矩阵,Σ 是对角矩阵。SVD 在数据降维和线性系统求解等领域有广泛应用。
import numpy as np
from scipy.linalg import svd
# 定义矩阵
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 奇异值分解
U, s, Vh = svd(A)
# 显示结果
print("SVD分解结果:")
print("U矩阵:\n", U)
print("奇异值:\n", s)
print("Vh矩阵:\n", Vh)
# 输出结果:
# U矩阵:
# [[-0.21483724 0.88723069 0.40824829]
# [-0.52058739 0.24964395 -0.61237224]
# [-0.82633755 -0.38794279 0.61237224]]
# 奇异值:
# [16.84810335 1.06836951 0. ]
# Vh矩阵:
# [[-0.47967118 -0.57236779 -0.66506439]
# [ 0.77669099 0.07568647 -0.62531812]
# [-0.40824829 0.81649658 -0.40824829]]
线性方程组的直接解法
直接求解线性方程组,计算出使方程组所有等式成立的变量值。每个方程代表一条直线,解为这些直线的交点。
# 定义矩阵A和向量B
A = np.array([[3, 1], [1, 2]])
B = np.array([9, 8])
# 求解线性方程组 Ax = B
x = np.linalg.solve(A, B)
print("线性方程组的解:", x)
# 输出结果: [2. 3.]
最小二乘拟合
最小二乘拟合用于寻找与数据点最匹配的解,最小化实际值与预测值的平方差。
# 定义矩阵A和向量B
A = np.array([[1, 1], [1, 2], [1, 3]])
B = np.array([1, 2, 2])
# 求解最小二乘问题
x, residuals, rank, s = np.linalg.lstsq(A, B, rcond=None)
print("最小二乘解:", x)
print("残差:", residuals)
print("矩阵秩:", rank)
print("奇异值:", s)
# 输出结果:
# 最小二乘解: [0.66666667 0.5]
# 残差: [0.33333333]
# 矩阵秩: 2
# 奇异值: [4.07914333 0.60049122]
矩阵范数
矩阵范数用于衡量一个矩阵的“大小”,常用于数值稳定性分析和矩阵分析。
# 定义矩阵
A = np.array([[1, 2], [3, 4]])
# 计算各种范数
frobenius_norm = np.linalg.norm(A, 'fro')
one_norm = np.linalg.norm(A, 1)
infinity_norm = np.linalg.norm(A, np.inf)
print("Frobenius范数:", frobenius_norm)
print("1-范数:", one_norm)
print("无穷范数:", infinity_norm)
# 输出结果:
# Frobenius范数: 5.477225575051661
# 1-范数: 6.0
# 无穷范数: 7.0
条件数
矩阵的条件数衡量输入变化对解的敏感性。条件数高表示解可能不稳定。
# 定义矩阵
A = np.array([[1, 2], [3, 4]])
# 计算条件数
condition_number = np.linalg.cond(A)
print("条件数:", condition_number)
# 输出结果: 14.933034373659268
矩阵秩
矩阵的秩是指其线性无关的行或列的数量,反映了矩阵所能覆盖的向量空间的维度。
# 定义矩阵
A = np.array([[1, 2], [3, 4]])
# 计算矩阵秩
rank_A = np.linalg.matrix_rank(A)
print("矩阵秩:", rank_A)
# 输出结果: 2
总结
NumPy 简化了矩阵运算和线性方程组求解等任务。你可以在官方网站了解更多关于这些 NumPy 函数的详细信息。