您的位置:首页 > 编程语言 > Python开发

『Numpy学习指南』第六章_深入学习NumPy模块(其一:线性代数模块)

2017-05-18 15:33 387 查看
矩阵求逆:np.linalg.inv(A)

import numpy as np

'''线性代数(np.linalg)'''

A = np.mat([[0,1,2],[1,0,3],[4,-3,8]])
print('A:\n',A)
### 矩阵求逆 ###
inverse = np.linalg.inv(A)
print('inverse of A:\n',inverse)
print('Check\n',A*inverse)


A:
[[ 0  1  2]
[ 1  0  3]
[ 4 -3  8]]
inverse of A:
[[-4.5  7.  -1.5]
[-2.   4.  -1. ]
[ 1.5 -2.   0.5]]
Check
[[ 1.  0.  0.]
[ 0.  1.  0.]
[ 0.  0.  1.]]


解线性方程组:np.linalg.solve(A,b)

最小二乘法解方程组:np.linalg.lstsq(A,b)[0]

A = np.mat([[1,-2,1],[0,2,-8],[-4,5,9]])
b=np.array([0,8,-9])
print('A:\n',A)
print('b:\n',b)
### 求解线性方程组(A*x=b) ###
x = np.linalg.solve(A,b)
print('Solution_solve:\n',x)
x2 = np.linalg.lstsq(A,b)[0]
print('Solution_lstsq:\n',x2)
print('Check:\n',np.dot(A,x))


A:
[[ 1 -2  1]
[ 0  2 -8]
[-4  5  9]]
b:
[ 0  8 -9]
Solution_solve:
[ 29.  16.   3.]
Solution_lstsq:
[ 29.  16.   3.]
Check:
[[ 0.  8. -9.]]


特征值: np.linalg.eigvals(A)

特征值&向量:eigenvalues,eigenvectors = np.linalg.eig(A)

A = np.mat([[3,-2],[1,0]])
print('A:\n',A)
### 求解特征值和特征向量(A*x=a*x) ###
# 获取特征值
print('Eigenvalues:\n',np.linalg.eigvals(A))
# 获取特征值和特征向量
eigenvalues,eigenvectors = np.linalg.eig(A)
print('Eigenvalues:\n',eigenvalues)
print('Eigenvector(按列算):\n',eigenvectors)
for i in range(len(eigenvalues)):
print('Left:\n',np.dot(A,eigenvectors[:,i]))
print('Right:\n',eigenvalues[i]*eigenvectors[:,i])


A:
[[ 3 -2]
[ 1  0]]
Eigenvalues:
[ 2.  1.]
Eigenvalues:
[ 2.  1.]
Eigenvector(按列算):
[[ 0.89442719  0.70710678]
[ 0.4472136   0.70710678]]
Left:
[[ 1.78885438]
[ 0.89442719]]
Right:
[[ 1.78885438]
[ 0.89442719]]
Left:
[[ 0.70710678]
[ 0.70710678]]
Right:
[[ 0.70710678]
[ 0.70710678]]


奇异值分解矩阵:U,Sigma,V = np.linalg.svd(A,full_matrices=False)

按照对角线填充矩阵:np.diag(Sigma)

A = np.mat([[4,11,14],[8,7,-2]])
print('A:\n',A)
### 奇异值分解 ###
U,Sigma,V = np.linalg.svd(A,full_matrices=False)
print('U:\n',U)
print('Sigma:\n',Sigma)                 # 得到的是奇异值并非矩阵
print('V:\n',V)
print('Sigma:\n',np.diag(Sigma))        # 还原奇异值矩阵
print('Check:\n',U*np.diag(Sigma)*V)


A:
[[ 4 11 14]
[ 8  7 -2]]
U:
[[-0.9486833  -0.31622777]
[-0.31622777  0.9486833 ]]
Sigma:
[ 18.97366596   9.48683298]
V:
[[-0.33333333 -0.66666667 -0.66666667]
[ 0.66666667  0.33333333 -0.66666667]]
Sigma:
[[ 18.97366596   0.        ]
[  0.           9.48683298]]
Check:
[[  4.  11.  14.]
[  8.   7.  -2.]]


广义逆矩阵: np.linalg.pinv(A)

A = np.mat([[4,11,14],[8,7,-2]])
print('A:\n',A)
### 广义逆矩阵 ###
pseudoinv = np.linalg.pinv(A)           # np.linalg.inv()只对方阵有效
print('Pseudo inverse:\n',pseudoinv)
print('Check:\n',A*pseudoinv)           # 并不严格,不过近似单位阵了


A:
[[ 4 11 14]
[ 8  7 -2]]
Pseudo inverse:
[[-0.00555556  0.07222222]
[ 0.02222222  0.04444444]
[ 0.05555556 -0.05555556]]
Check:
[[  1.00000000e+00  -5.55111512e-16]
[  0.00000000e+00   1.00000000e+00]]


行列式求值:np.linalg.det(A)

A = np.mat([[3,4],[5,6]])
print('A:\n',A)
### 行列式 ###
print('Determinant:\n',np.linalg.det(A))


A:
[[3 4]
[5 6]]
Determinant:
-2.0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: