5.6Python数据处理篇之Sympy系列(六)---矩阵的操作
目录
目录
前言
今天我们学习的是,有关sympy的矩阵操作
对应官方的:Matrices
官方教程
https://docs.sympy.org/latest/tutorial/matrices.html
参考网站
https://junjiecai.github.io/posts/2017/Jan/30/sympy_intro_3/
(一)矩阵的创建-Matrix()
1.说明:
Matrix(list),使用list来确定矩阵的维度。
2.源代码:
from sympy import *
# 一纬矩阵
m1 = Matrix([1, 2, 3])
#二维矩阵
m2 = Matrix([[1, -1], [3, 4], [0, 2]])
print(latex(m1))
print(latex(m2))
3.输出:
\[\left[\begin{matrix}1\\2\\3\end{matrix}\right]
\]
\[\left[\begin{matrix}1 & -1\\3 & 4\\0 & 2\end{matrix}\right]
\]
(二)常用的构造矩阵
1.说明:
可以使用sympy自带的方法来快速的构造常用矩阵
- 单位矩阵:eye()
- 零矩阵:zeros()
- 一矩阵:ones()
- 对角矩阵:diag()
2.源代码:
from sympy import *
# 单位矩阵
m1 = eye(3)
print(latex(m1))
# 零矩阵
m2 = zeros(3, 4)
print(latex(m2))
# 一矩阵
m3 = ones(3, 4)
print(latex(m3))
# 对角矩阵
m4 = diag([1, 2, 3])
print(latex(m4))
3.输出:
单位矩阵
\[\left[\begin{matrix}1 & 0 & 0\\0 & 1 & 0\\0 & 0 & 1\end{matrix}\right]
\]
零矩阵
\[\left[\begin{matrix}0 & 0 & 0 & 0\\0 & 0 & 0 & 0\\0 & 0 & 0 & 0\end{matrix}\right]
\]
一矩阵
\[\left[\begin{matrix}1 & 1 & 1 & 1\\1 & 1 & 1 & 1\\1 & 1 & 1 & 1\end{matrix}\right]
\]
对角矩阵
\[\left[\begin{matrix}1 & 0 & 0\\0 & 2 & 0\\0 & 0 & 3\end{matrix}\right]
\]
(三)基本操作
1.说明:
基本操作有以下几个:
- 获取形状:.shape()
- 获得单行与单列:.row(n) .col(n)
- 删除行与列:row_del(n) .col_del(n)
- 插入新行与列:.row_insert(pos, M) .col_insert(pos, M)
- 对矩阵求转置:m.T
2.源代码:
from sympy import *
m = Matrix([[1, -1], [3, 4], [0, 2]])
# 矩阵
print(m)
# 获得形状
print(m.shape)
# 获得单行与单列
print(m.row(0))
print(m.col(0))
# 删除行与列
m.row_del(0)
print("删除第一行后:", m)
m.col_del(0)
print("删除第一列后:", m)
print(m)
# 插入新的行与列
m2 = Matrix([[2, 3]])
print("m2:", m2)
m2 = m2.row_insert(1, Matrix([[0, 4]]))
print("插入新行后:", m2)
m2 = m2.col_insert(2, Matrix([9, 8]))
print("插入新列后:", m2)
# 求逆矩阵
print("其逆矩阵是:", m2.T)
3.输出:
\[m = \left[\begin{matrix}1 & -1\\3 & 4\\0 & 2\end{matrix}\right]
\]
其形状是:(3, 2)
第一行是:
\[\left[\begin{matrix}1 & -1\end{matrix}\right]
\]
第一列是:
\[\left[\begin{matrix}1\\3\\0\end{matrix}\right]
\]
删除第一行后:
\[\left[\begin{matrix}3 & 4\\0 & 2\end{matrix}\right]
\]
删除第一列后:
\[\left[\begin{matrix}4\\2\end{matrix}\right]
\]
\[m2 = \left[\begin{matrix}2 & 3\end{matrix}\right]
\]
插入一行是:
\[\left[\begin{matrix}2 & 3\\0 & 4\end{matrix}\right]
\]
插入一列是:
\[\left[\begin{matrix}2 & 3 & 9\\0 & 4 & 8\end{matrix}\right]
\]
其转转置矩阵是:
\[\left[\begin{matrix}2 & 3 & 9\\0 & 4 & 8\end{matrix}\right]
\]
(四)矩阵的运算
1.加减法
(1)说明:
sympy里的加减法,直接使用+ -即可
(2)源代码:
from sympy import *
M = Matrix([1, 2, 3])
N = Matrix([4, 5, 6])
# 加法与减法
print("M+N:", M+N)
print("M-N:", M-N)
(3)输出效果:
\[M = \left[\begin{matrix}1\\2\\3\end{matrix}\right]
\]
\[N = \left[\begin{matrix}4\\5\\6\end{matrix}\right]
\]
\[M + N =\left[\begin{matrix}5\\7\\9\end{matrix}\right]
\]
\[M - N = \left[\begin{matrix}-3\\-3\\-3\end{matrix}\right]
\]
2.乘法与求逆
(1)说明:
乘法:*
求逆矩阵:M**(-1)
(2)源代码:
from sympy import *
M = Matrix([[1, -1, 1], [2, 3, -2]])
N = Matrix([[1, 2], [2, 1], [1, 1]])
# 求乘法
print(M*N)
# 求逆矩阵
m = Matrix([[1, 3], [-2, 3]])
print(m**(-1))
(3)输出效果:
\[M = \left[\begin{matrix}1 & -1 & 1\\2 & 3 & -2\end{matrix}\right]
\]
\[N = \left[\begin{matrix}1 & 2\\2 & 1\\1 & 1\end{matrix}\right]
\]
\[M*N = \left[\begin{matrix}0 & 2\\6 & 5\end{matrix}\right]
\]
\[m = \left[\begin{matrix}1 & 3\\-2 & 3\end{matrix}\right]
\]
\[m^{-1} = \left[\begin{matrix}\frac{1}{3} & - \frac{1}{3}\\\frac{2}{9} & \frac{1}{9}\end{matrix}\right]
\]
(五)行列式
1.说明:
- 求行列式:M.det()
- 求阶梯矩阵:M.rref()
- 求特征值与向量:M.eignvals()
2.源代码:
from sympy import *
M = Matrix([[1, 0, 1], [2, -1, 3], [4, 3, 2]])
# 求行列式
print("行列式:", M.det())
# 求阶梯行列式
print("阶梯行列式:", M.rref())
# 求特征值与特征向量
M = Matrix([[3, -2, 4, -2], [5, 3, -3, -2], [5, -2, 2, -2], [5, -2, -3, 3]])
print("特征值与特征向量: ", M.eigenvals())
3.输出:
\[\begin{vmatrix}1 & 0 & 1\\2 & -1 & 3\\4 & 3 & 2\end{vmatrix}=1
\]
\[M = \left[\begin{matrix}1 & 0 & 1\\2 & -1 & 3\\4 & 3 & 2\end{matrix}\right]
\]
M的阶梯矩阵:
\[\left ( \left[\begin{matrix}1 & 0 & 0\\0 & 1 & 0\\0 & 0 & 1\end{matrix}\right], \quad \left ( 0, \quad 1, \quad 2\right )\right )
\]
另一个M矩阵:
\[M = \left[\begin{matrix}3 & -2 & 4 & -2\\5 & 3 & -3 & -2\\5 & -2 & 2 & -2\\5 & -2 & -3 & 3\end{matrix}\right]
\]
其特征值是:
\[\left \{ -2 : 1, \quad 3 : 1, \quad 5 : 2\right \}
\]
(六)对角化矩阵
1.说明:
如果要对角化一个矩阵,用
diagonalize()
2.源代码:
from sympy import *
M = Matrix([[3, -2, 4, -2], [5, 3, -3, -2], [5, -2, 2, -2], [5, -2, -3, 3]])
P, D = M.diagonalize()
print('矩阵M')
print(M)
print('矩阵P')
print(P)
print('矩阵D')
print(D)
print("P*D*P**-1")
print(P*D*P**-1)
3.输出:
\[M = \left[\begin{matrix}3 & -2 & 4 & -2\\5 & 3 & -3 & -2\\5 & -2 & 2 & -2\\5 & -2 & -3 & 3\end{matrix}\right]
\]
\[ P = \left[\begin{matrix}0 & 1 & 1 & 0\\1 & 1 & 1 & -1\\1 & 1 & 1 & 0\\1 & 1 & 0 & 1\end{matrix}\right]
\]
\[D = \left[\begin{matrix}-2 & 0 & 0 & 0\\0 & 3 & 0 & 0\\0 & 0 & 5 & 0\\0 & 0 & 0 & 5\end{matrix}\right]
\]
\(PDP^{−1}=\)
\[\left[\begin{matrix}3 & -2 & 4 & -2\\5 & 3 & -3 & -2\\5 & -2 & 2 & -2\\5 & -2 & -3 & 3\end{matrix}\right]
\]