「SymPy」符号运算 矩阵Matrix及基础运算
Posted 行吟客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「SymPy」符号运算 矩阵Matrix及基础运算相关的知识,希望对你有一定的参考价值。
目录
导言
在前几篇文章中,我们学习了SymPy
基础/高级用法、方程求解、微积分以及向量运算等内容,本节我们学习SymPy
核心内容之一Matrix
矩阵计算(基础)。
传送链接:
「SymPy」符号运算(1) 简介/符号/变量/函数/表达式/等式/不等式/运算符
「SymPy」符号运算(2) 各种形式输出、表达式的化简合并与展开
「SymPy」符号运算(3) (非)线性方程(组)求解、数列求和、连乘、求极限
「SymPy」符号运算(4) 微积分与有限差分
「SymPy」符号运算(5) Vector向量及运算
sympy.matrices
官方文档1:https://docs.sympy.org/latest/tutorials/intro-tutorial/matrices.html?highlight=matrix
创建矩阵
SymPy
的矩阵模块具有丰富的矩阵初始化方法,类比于NumPy
中np.ndarray
数组等数据结构的创建方式,Matrix
的初始化方法大同小异。
列表初始化
创建一个矩阵M
,即创建一个Matrxi
实例:
import sympy
from sympy.matrices import Matrix
M = Matrix([[1,0,0], [0,0,0]]);
M
输出:
[
1
0
0
0
0
0
]
\\left[\\beginmatrix1 & 0 & 0\\\\0 & 0 & 0\\endmatrix\\right]
[100000]
如果用sympy.pprint()
函数输出,则输出为
[1 0 0]
[ ]
[0 0 0]
Matrices
模块处理的是二维数据,一维带符号的数据可以用Matrix
或上一篇讲过的vector
,高维数据可以用tensor
中的array
,之后会单开一篇讲到。当然三者也是可以相互转换的。
Matrices
创建矩阵时,如果是像上述那样利用两层嵌套列表初始化,则里层括号内的数据为一行。
在刚才创建的矩阵M
的基础上添加一行:
Matrix([M, (0,0,-1)])
# 或者 Matrix([M, [0,0,-1])
输出:
[
1
0
0
0
0
0
0
0
−
1
]
\\left[\\beginmatrix1 & 0 & 0\\\\0 & 0 & 0\\\\0 & 0 & -1\\endmatrix\\right]
10000000−1
行向量
Matrices
也可以创建一维数据集,用两层嵌套列表(两个方括号)创建一行数据得到行向量:
Matrix([[1, 2, 3]])
输出:
[
1
2
3
]
\\left[\\beginmatrix1 & 2 & 3\\endmatrix\\right]
[123]
列向量
而如果只用一个方括号(没有嵌套的列表)产生一维Matrices
,则得到列向量:
Matrix([1, 2, 3])
输出:
[
1
2
3
]
\\left[\\beginmatrix1\\\\2\\\\3\\endmatrix\\right]
123
维度和数集
给定矩阵维度为
2
×
3
2\\times 3
2×3,元素为
1
,
2
,
…
6
1, 2, \\dots6
1,2,…6,则Matrix
可以自动按照给定的矩阵大小将给定的数据按行优先填充进去:
Matrix(2, 3, [1, 2, 3, 4, 5, 6])
# Matrix(2, 3, [1, 2, 3, 4, 5]) # 报错ValueError,给定的数据总数需要与矩阵大小相容
[ 1 2 3 4 5 6 ] \\left[\\beginmatrix1 & 2 & 3\\\\4 & 5 & 6\\endmatrix\\right] [142536]
二元函数
假设我们想要创建的矩阵为
M
a
×
b
M_a\\times b
Ma×b,脚标
a
a
a和
b
b
b对应的元素
m
a
b
m_ab
mab满足二元函数
f
(
a
,
b
)
f(a, b)
f(a,b) ,则可以将函数名传递给Matirx
函数自动创建矩阵:
def f(a, b):
if a == b:
return 1
elif a > b:
return 2 * a
else:
return 0
# 创建4x4矩阵,元素满足函数f(a, b),其中a,b是整数脚标
Matrix(4, 4, f)
输出:
[
1
0
0
0
2
1
0
0
4
4
1
0
6
6
6
1
]
\\left[\\beginmatrix1 & 0 & 0 & 0\\\\2 & 1 & 0 & 0\\\\4 & 4 & 1 & 0\\\\6 & 6 & 6 & 1\\endmatrix\\right]
1246014600160001
lambda
函数
用lambda
构造一个二元函数,和前面讲的双变量函数逻辑一样:
# 创建3x4矩阵,元素为 1 - (i+j) % 2,其中i,j是整数脚标
Matrix(3, 4, lambda i,j: 1 - (i+j) % 2)
特殊矩阵
导入:
from sympy.matrices import Matrix, eye, zeros, ones, diag, GramSchmidt
- 单位矩阵:
eye(n)
,单位方阵 n × n n\\times n n×n - 零矩阵:
zeros(n)
,零方阵 n × n n\\times n n×n;zeros(n, m)
,零矩阵 n × m n\\times m n×m - 一矩阵:
ones(3)
,一方阵 n × n n\\times n n×n;ones(n, m)
,一矩阵 n × m n\\times m n×m - 对角阵:
diag(a, b, c, ...)
,对角元素为 a , b , c , … a, b, c,\\dots a,b,c,…
举例:
from sympy.matrices import Matrix, eye, zeros, ones, diag, GramSchmidt
import sympy
eye(5)
输出:
[
1
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
1
0
0
0
0
0
1
]
\\left[\\beginmatrix1 & 0 & 0 & 0 & 0\\\\0 & 1 & 0 & 0 & 0\\\\0 & 0 & 1 & 0 & 0\\\\0 & 0 & 0 & 1 & 0\\\\0 & 0 & 0 & 0 & 1\\endmatrix\\right]
1000001000001000001000001
zeros(3, 4)
[ 0 0 0 0 0 0 0 0 0 0 0 0 ] \\left[\\beginmatrix0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0\\endmatrix\\right] 000000000000
x, y = sympy.symbols('x y', real = True)
diag(10, Matrix([[x, 4], [6, y]]), eye(2))
[
10
0
0
0
0
0
x
4
0
0
0
6
y
0
0
0
0
0
1
0
0
以上是关于「SymPy」符号运算 矩阵Matrix及基础运算的主要内容,如果未能解决你的问题,请参考以下文章 将 SymPy 矩阵转换为 numpy 数组/矩阵的最佳方法是啥 Python sympy做代数运算解Cholesky求逆的L和L逆矩阵示例