线性代数
大约 3 分钟PythonPythonNumPy
线性代数
NumPy 提供了线性代数模块,用于进行矩阵和向量的线性代数运算。
一、向量点积
import numpy as np
arr1 = np.array([1,2,5])
arr2 = np.array([2,2,4])
res = np.dot(arr1, arr2)
print(res)
对应元素相乘
26
二、范数
numpy.linalg.norm
函数可以计算向量或矩阵的范数,主要用于度量向量、矩阵等大小或距离。
可以通过 ord
参数计算不同的范数:
ord=None
:默认的二范数。ord=1
:一范数,向量元素绝对值的和。ord=2
:二范数,向量元素平方和的平方根。ord=np.inf
:无穷范数,向量元素绝对值的最大值。ord=-np.inf
:负无穷范数,向量元素绝对值的最小值。ord='fro'
:Frobenius 范数,用于矩阵,是元素平方和的平方根。ord=0
:零范数,非零元素的个数(仅对向量有意义)。
import numpy as np
# 向量范数
vector = np.array([1, 2, 3])
# 二范数(默认)
norm_2 = np.linalg.norm(vector)
# 一范数
norm_1 = np.linalg.norm(vector, ord=1)
# 无穷范数
norm_inf = np.linalg.norm(vector, ord=np.inf)
print("2-norm:", norm_2)
print("1-norm:", norm_1)
print("Infinity norm:", norm_inf)
# 矩阵范数
matrix = np.array([[1, 2], [3, 4]])
# Frobenius 范数(默认)
norm_fro = np.linalg.norm(matrix)
# 一范数(列和最大值)
norm_matrix_1 = np.linalg.norm(matrix, ord=1)
# 无穷范数(行和最大值)
norm_matrix_inf = np.linalg.norm(matrix, ord=np.inf)
print("Frobenius norm:", norm_fro)
print("1-norm:", norm_matrix_1)
print("Infinity norm:", norm_matrix_inf)
2-norm: 3.7416573867739413
1-norm: 6.0
Infinity norm: 3.0
Frobenius norm: 5.477225575051661
1-norm: 6.0
Infinity norm: 7.0
三、矩阵相乘
使用np.dot
或 @
可以计算两个矩阵的乘法。
import numpy as np
matrix1 = np.array([[1, 2], [3, 4]])
matrix2 = np.array([[5, 6], [7, 8]])
res1 = np.dot(matrix1, matrix2)
print(res1)
res2 = matrix1 @ matrix2
print(res2)
[[19 22]
[43 50]]
[[19 22]
[43 50]]
四、矩阵转置
使用np.transpose
或 .T
可以得到转置矩阵。
import numpy as np
matrix = np.array([[1, 2], [3, 4]])
res1 = np.transpose(matrix)
print(res1)
res2 = matrix.T
print(res2)
[[1 3]
[2 4]]
[[1 3]
[2 4]]
五、矩阵的逆矩阵
np.linalg.inv
: 求逆矩阵,如果矩阵不可逆(即奇异或退化),会抛出异常。
np.allclose
判断两个矩阵是否近似相同
matrix = np.array([[1, 2, 3], [3, 4, 8], [4,5,6]])
matrix_inverse = np.linalg.inv(matrix) # 求A的逆矩阵
print(matrix_inverse)
# 判断矩阵乘以逆矩阵的结果是不是单位矩阵
x = np.allclose(np.dot(matrix, matrix_inverse), np.eye(3))
print(x)
[[-1.77777778 0.33333333 0.44444444]
[ 1.55555556 -0.66666667 0.11111111]
[-0.11111111 0.33333333 -0.22222222]]
True
六、伴随矩阵
np.linalg.det
求行列式。
matrix = np.array([[1, 2, 3], [3, 4, 8], [4,5,6]])
det = np.linalg.det(matrix)
print(f"行列式为: {det}")
# 求A的伴随矩阵
matrix_companion = matrix_inverse * det
print(f"伴随矩阵为: {matrix_companion}")
行列式为 8.999999999999998
伴随矩阵为: [[-16. 3. 4.]
[ 14. -6. 1.]
[ -1. 3. -2.]]
七、求解线性方程组
A = np.array([[3, 1], [1, 2]])
b = np.array([9, 8])
result = np.linalg.solve(A, b)
print(result)
[2. 3.]
八、矩阵特征值和特征向量
给定一个方阵 A
,如果存在一个非零向量 v
和一个标量 λ
,使得 Av=λv
,那么 λ
称为 A
的特征值,v
称为对应于 λ
的特征向量。
numpy.linalg.eig
函数可以用来计算方阵的特征值和特征向量。
import numpy as np
# 定义一个方阵
A = np.array([[4, -2],
[1, 1]])
# 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(A)
print(A)
print(eigenvalues)
print(eigenvectors)
[[ 4 -2]
[ 1 1]]
[3. 2.]
[[0.89442719 0.70710678]
[0.4472136 0.70710678]]
九、矩阵的秩
矩阵的秩是指矩阵中线性无关行或列的最大数量。
import numpy as np
# 定义一个矩阵
matrix = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 计算矩阵的秩
rank = np.linalg.matrix_rank(matrix)
print(rank)
2
十、矩阵的迹
矩阵的迹是指方阵主对角线元素的和。
# 定义一个方阵
matrix = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 计算矩阵的迹
trace = np.trace(matrix)
print(trace)
15