Numpy库 线性代数linalg模块中的一些函数
参考文章:https://www.cnblogs.com/xieshengsen/p/6836430.html
https://blog.csdn.net/hqh131360239/article/details/79061535
Numpy.linalg模块包含线性代数的函数。使用这个模块,可以计算逆矩阵、求特征值、解线性方程组以及求解行列式等。
https://docs.scipy.org/doc/numpy/reference/routines.linalg.html
函数 | 描述 |
---|---|
dot | 两个数组的点积,即元素对应相乘 |
vdot | 两个向量的点积 |
inner | 两个数组的内积 |
matmul | 两个数组的矩阵积 |
determinant | 数组的行列式 |
solve | 求解线性方程组 |
inv | 计算矩阵的逆 |
1. 计算逆矩阵 numpy.linalg.inv()
import numpy as np
A=np.mat("0 1 2;1 0 3;4 -3 8") #创建矩阵
print(A)
输出结果:[[ 0 1 2]
[ 1 0 3]
[ 4 -3 8]]
inv=np.linalg.inv(A) #利用inv函数计算逆矩阵
print(inv)
输出结果:[[-4.5 7. -1.5]
[-2. 4. -1. ]
[ 1.5 -2. 0.5]]
print(A*inv) #检查求得的矩阵与原矩阵相乘为单位矩阵
输出结果:[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
mat()函数 :将目标数据中的类型转化为矩阵
补充 :print( A.I) 输出矩阵A的逆矩阵
2. 求解线性方程组 numpy.linalg.solve()
numpy.linalg中的函数solve可以求解形如 Ax = b 的线性方程组,其中 A 为矩阵,b 为一维或二维的数组,x 是未知变量
import numpy as np
A=np.mat('1 -2 1;0 2 -8;-4 5 9') #创建矩阵和数组
b=np.array([0,8,-9])
x=np.linalg.solve(A,b) #调用solve函数求解线性方程组
print(x)
输出结果:[29. 16. 3.]
print(np.dot(A,x)) #调用dot函数检查求得的解是否正确
输出结果:[[ 0. 8. -9.]]
dot()函数 :返回两个数组的点积
- 如果处理的是一维数组,则得到的是两数组的內积
- 如果是二维数组(矩阵)之间的运算,则得到的是矩阵积
3. 特征值和特征向量 numpy.linalg. eigvals() / eig()
特征值(eigenvalue)即方程 Ax = λx 的根,是一个标量。其中,A 是一个二维矩阵,x 是一个一维向量。特征向量(eigenvector)是关于特征值的向量。
numpy.linalg模块中,eigvals函数可以计算矩阵的特征值,而eig函数可以返回一个包含特征值和对应的特征向量的元组。
import numpy as np
C=np.mat('3 -2;1 0')
c0=np.linalg.eigvals(C) #调用eigvals函数求解特征值
print(c0)
输出结果:[2. 1.]
c1,c2=np.linalg.eig(C) #eig函数求解特征值和特征向量
print(c1)
输出结果:[2. 1.]
print(c2)
输出结果:[[0.89442719 0.70710678]
[0.4472136 0.70710678]]
for i in range(len(c1)):
print('left:',np.dot(C,c2[:,i]))
print('right:',c1[i]*c2[:,i])
输出结果:
left: [[1.78885438]
[0.89442719]]
right: [[1.78885438]
[0.89442719]]
left: [[0.70710678]
[0.70710678]]
right: [[0.70710678]
[0.70710678]]
4. 奇异值分解 numpy.linalg.svd()
SVD(Singular Value Decomposition,奇异值分解)是一种因子分解运算,将一个矩阵分解为3个矩阵的乘积。
numpy.linalg模块中的svd函数可以对矩阵进行奇异值分解。该函数返回3个矩阵——U、Sigma和V,其中U和V是正交矩阵,Sigma包含输入矩阵的奇异值。
import numpy as np
D=np.mat ('4 11 14;8 7 -2')
U,Sigma,V=np.linalg.svd(D,full_matrices=False) #使用svd函数分解矩阵
print('U:',U)
输出结果:U: [[-0.9486833 -0.31622777]
[-0.31622777 0.9486833 ]]
print('Sigma:',Sigma)
输出结果:Sigma: [18.97366596 9.48683298]
print('V:',V)
输出结果:V: [[-0.33333333 -0.66666667 -0.66666667]
[ 0.66666667 0.33333333 -0.66666667]]
print(U*np.diag(Sigma)*V)
#使用diag函数生成完整的奇异值矩阵,将分解的3个矩阵相乘
输出结果:[[ 4. 11. 14.]
[ 8. 7. -2.]]
diag():返回一个矩阵的对角线元素或创建一个对角阵
当 np.diag(array) 中
array是一个1维数组时,结果形成一个以一维数组为对角线元素的矩阵
array是一个二维矩阵时,结果输出矩阵的对角线元素
5. 广义逆矩阵 numpy.linalg.pinv()
使用numpy.linalg模块中的pinv函数进行求解,inv函数只接受方阵作为输入矩阵,而pinv函数则没有这个限制。
import numpy as np
E=np.mat('4 11 14;8 7 -2')
pseudoinv=np.linalg.pinv(E) #使用pinv函数计算广义逆矩阵
print(pseudoinv)
输出结果:
[[-0.00555556 0.07222222]
[ 0.02222222 0.04444444]
[ 0.05555556 -0.05555556]]
print(E*pseudoinv) #将原矩阵和得到的广义逆矩阵相乘
输出结果:
[[ 1.00000000e+00 -9.29811783e-16]
[-1.66533454e-16 1.00000000e+00]]
补充 : print(A.I) 输出矩阵A的广义逆矩阵
6. 行列式 numpy.linalg.det()
import numpy as np
F=np.mat('3 4;5 6')
print(np.linalg.det(F)) #使用det函数计算行列式
输出结果:-1.9999999999999971
7. 求解范数 numpy.linalg.norm()
x_norm=np.linalg.norm(x, ord=None, axis=None, keepdims=False)
参数:
x:表示矩阵
ord:范数类型,默认是2范数
矩阵的范数:
ord=1:列和的最大值
ord=2:|λE-ATA|=0,求特征值,然后求最大特征值得算术平方根
ord=∞:行和的最大值
ord=None:默认情况下,是求整体的矩阵元素平方和,再开根号。(没仔细看,以为默认情况下就是矩阵的二范数,修正一下,默认情况下是求整个矩阵元素平方和再开根号)
③axis:处理类型
axis=1表示按行向量处理,求多个行向量的范数
axis=0表示按列向量处理,求多个列向量的范数
axis=None表示矩阵范数。
④keepding:是否保持矩阵的二维特性
import numpy as np
x=np.array([[0,3,4],[1,6,4]])
#默认参数ord=None,axis=None,keepdims=False
print('默认参数(矩阵整体元素平方和开根号,不保留矩阵二维特性):',np.linalg.norm(x))
print('矩阵整体元素平方和开根号,保留矩阵二维特性:',np.linalg.norm(x,keepdims=True))
print('矩阵每个行向量求向量的2范数:',np.linalg.norm(x,axis=1,keepdims=True))
print('矩阵每个列向量求向量的2范数:',np.linalg.norm(x,axis=0,keepdims=True))
print('矩阵1范数:',np.linalg.norm(x,ord=1,keepdims=True))
print('矩阵2范数:',np.linalg.norm(x,ord=2,keepdims=True))
print('矩阵∞范数:',np.linalg.norm(x,ord=np.inf,keepdims=True))
输出结果:
默认参数(矩阵整体元素平方和开根号,不保留矩阵二维特性): 8.831760866327848
矩阵整体元素平方和开根号,保留矩阵二维特性: [[8.83176087]]
矩阵每个行向量求向量的2范数: [[5. ]
[7.28010989]]
矩阵每个列向量求向量的2范数: [[1. 6.70820393 5.65685425]]
矩阵1范数: [[9.]]
矩阵2范数: [[8.70457079]]
矩阵∞范数: [[11.]]
inf 表示正无穷
-inf表示负无穷
上一篇: 达梦数据库迁移数据报错 字符串截断
下一篇: 有趣的Linux设置,让你爱上Linux