跳至主要內容

线性代数

blacklad大约 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
上次编辑于:
贡献者: blacklad