前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python sympy 模块常用功能(三)

Python sympy 模块常用功能(三)

作者头像
用户6021899
发布2019-08-14 17:14:20
1.7K0
发布2019-08-14 17:14:20
举报
文章被收录于专栏:Python编程 pyqt matplotlib
  • 创建矩阵
代码语言:javascript
复制
>>> from sympy import *
>>> init_printing(use_unicode=True)
# Matrix() 函数用于创建矩阵
>>> Matrix([[1, -1], [3, 4], [0, 2]]) #嵌套的列表做参数

⎡1 -1⎤
⎢3 4 ⎥
⎣0 2 ⎦
  • 创建列向量
代码语言:javascript
复制
>>> Matrix([1, 2, 3])#传入列表
⎡1⎤
⎢2⎥
⎣3⎦
  • 矩阵的形状(尺寸大小)
代码语言:javascript
复制
>>> M = Matrix([[1, 2, 3], [-2, 0, 4]])
>>> M
⎡1 2  3⎤
⎣-2 0 4⎦
>>> M.shape # .shape 属性
(2, 3)
  • 访问矩阵的行或列
代码语言:javascript
复制
>>> M.row(0) #第0行(索引从0开始)
[1 2 3]
>>> M.col(-1)#最后一列
⎡3⎤
⎣4⎦
  • 删除矩阵的行或列 >>> M.col_del(0) >>> M ⎡2 3⎤ ⎣0 4⎦ >>> M.row_del(1) >>> M [2 3]
  • 添加行或列
代码语言:javascript
复制
>>> M
[2 3]
>>> M = M.row_insert(1, Matrix([[0, 4]]))
>>> M
⎡2 3⎤
⎣0 4⎦
>>> M = M.col_insert(0, Matrix([1, -2]))
>>> M
⎡1 2 3⎤
⎣-2 0 4⎦

注意,添加行或列是非原位操作(do not operate in place), 不改变原来的矩阵,返回一个新的矩阵。

  • 基础的矩阵运算
代码语言:javascript
复制
>>> M = Matrix([[1, 3], [-2, 3]])
>>> N = Matrix([[0, 3], [0, 7]])
>>> M + N #加法
⎡1 6 ⎤
⎣-2 10⎦
>>> M*N #矩阵乘法
⎡0 24⎤
⎣0 15⎦
>>> 3*M #数乘
⎡3 9⎤
⎣-6 9⎦
>>> M**2 #平方,还是矩阵乘法
⎡-5 12⎤
⎣-8 3 ⎦
>>> M**-1 #矩阵 求逆矩阵
⎡1/3 -1/3⎤
⎣2/9 1/9 ⎦
>>> N**-1 # 行列式为 0, 逆矩阵不存在
Traceback (most recent call last):
...ValueError: Matrix det == 0; not invertible.

>>> M = Matrix([[1, 2, 3], [4, 5, 6]])
>>> M
⎡1 2 3⎤
⎣4 5 6⎦
>>> M.T #矩阵的转置
⎡1 4⎤
⎢2 5⎥
⎣3 6⎦
  • 单位矩阵
代码语言:javascript
复制
>>> eye(3) #eye(n) 返回n阶单位矩阵
⎡1 0 0⎤
⎢0 1 0⎥
⎣0 0 1⎦
  • 零矩阵 和 一 矩阵
代码语言:javascript
复制
>>> zeros(2, 3) # zeros(m, n) 返回 m行 n 列 零矩阵
⎡0 0 0⎤
⎣0 0 0⎦
>>> ones(3, 2) # ones(m, n) 返回 m行 n 列 一矩阵
⎡1 1⎤
⎢1 1⎥
⎣1 1⎦
  • 对角线矩阵 使用diag()函数创建主对角线矩阵,参数可以是数,也可以是矩阵。数代表1x1矩阵。各个参数代表的矩阵沿着主对角线从左上往右下排列。
代码语言:javascript
复制
>>> diag(1, 2, 3)
⎡1 0 0⎤
⎢0 2 0⎥
⎣0 0 3⎦

>>> diag(-1, ones(2, 2), Matrix([5, 7, 5]))
⎡-1 0 0 0⎤
⎢0 1 1 0⎥
⎢0 1 1 0⎥
⎢0 0 0 5⎥
⎢0 0 0 7⎥
⎣0 0 0 5⎦
  • 矩阵的行列式 >>> M = Matrix([[1, 0, 1], [2, -1, 3], [4, 3, 2]]) >>> M ⎡1 0 1⎤ ⎢2 -1 3⎥ ⎣4 3 2⎦ >>> M.det() -1 >>> from sympy.abc import * >>> M = Matrix([[a,0,0],[0,b,0],[0,0,c]]) >>> M ⎡a 0 0⎤ ⎢0 b 0⎥ ⎣0 0 c⎦ >>> M.det() a⋅b⋅c
  • 行阶梯形

.rref()方法返回包含两个元素的tuple, 第一个是行阶梯形矩阵,第二个是列号列表

代码语言:javascript
复制
>>> M = Matrix([[1, 0, 1, 3], [2, 3, 4, 7], [-1, -3, -3, -4]])
>>> M
⎡1 0 1 3 ⎤
⎢2 3 4 7 ⎥
⎣-1 -3 -3 -4⎦
>>> M.rref()
⎛⎡1 0  1   3 ⎤, [0, 1]⎞
⎜⎢0 1 2/3 1/3⎟       ⎟ 
⎝⎣0 0  0   0  ⎦       ⎠
  • 矩阵的秩
代码语言:javascript
复制
>>> M.rank()
2
  • Nullspace >>> M = Matrix([[1, 2, 3, 0, 0], [4, 10, 0, 0, 1]]) >>> M ⎡1 2 3 0 0⎤ ⎣4 10 0 0 1⎦ >>> M.nullspace() ⎡⎡-15⎤,⎡0⎤, ⎡ 1 ⎤⎤ ⎢⎢ 6 ⎥ ⎢0⎥ ⎢-1/2⎥⎥ ⎢⎢ 1 ⎥ ⎢0⎥ ⎢ 0 ⎥⎥ ⎢⎢ 0 ⎥ ⎢1⎥ ⎢ 0 ⎥⎥ ⎣⎣ 0 ⎦ ⎣0⎦ ⎣ 1 ⎦⎦
  • 特征值,特征向量 >>> M = Matrix([[3, -2, 4, -2], [5, 3, -3, -2], [5, -2, 2, -2], [5, -2, -3, 3]]) >>> M ⎡3 -2 4 -2⎤ ⎢5 3 -3 -2⎥ ⎢5 -2 2 -2⎥ ⎣5 -2 -3 3 ⎦ >>> M.eigenvals()#求特征值,返回一个字典,字典的键是特征值,字典的值是代数重数 {-2: 1, 3: 1, 5: 2}
代码语言:javascript
复制
>>> M.eigenvects()#求特征向量,返回一个列表,(eigenvalue:algebraic multiplicity, [eigenvectors])
⎡⎛-2, 1,  ⎡⎡0⎤⎤⎞, ⎛3, 1, ⎡⎡1⎤⎤⎞, ⎛5, 2, ⎡⎡1⎤, ⎡0 ⎤⎤⎞⎤
⎢⎜        ⎢⎢1⎥⎥⎟  ⎜      ⎢⎢1⎥⎥⎟ ⎜       ⎢⎢1⎥  ⎢-1⎥⎥⎟⎥
⎢⎜        ⎢⎢1⎥⎥⎟  ⎜      ⎢⎢1⎥⎥⎟ ⎜       ⎢⎢1⎥  ⎢0 ⎥⎥⎟⎥
⎣⎝        ⎣⎣1⎦⎦⎠  ⎝      ⎣⎣1⎦⎦⎠ ⎝       ⎣⎣0⎦  ⎣1 ⎦⎦⎠⎦

若只求特征多项式,可用.charpoly()方法:

>>> lamda = symbols(’lamda’) >>> p = M.charpoly(lamda) >>> factor(p) ( λ- 5)2 ⋅( λ- 3)⋅( λ+ 2)

  • 对角化
代码语言:javascript
复制
>>> P, D = M.diagonalize()
>>> P
⎡0 1 1 0 ⎤
⎢1 1 1 -1⎥
⎢1 1 1 0 ⎥
⎣1 1 0 1 ⎦
>>> D
⎡-2 0 0 0⎤
⎢0 3 0 0⎥
⎢0 0 5 0⎥
⎣0 0 0 5⎦
>>> P*D*P**-1 #验证
⎡3 -2 4 -2⎤
⎢5 3 -3 -2⎥
⎢5 -2 2 -2⎥
⎣5 -2 -3 3 ⎦
>>> P*D*P**-1 == M
True
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档