「SymPy」符号运算 矩阵Matrix及基础运算

Posted 行吟客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「SymPy」符号运算 矩阵Matrix及基础运算相关的知识,希望对你有一定的参考价值。

目录


导言

在前几篇文章中,我们学习了SymPy基础/高级用法、方程求解、微积分以及向量运算等内容,本节我们学习SymPy核心内容之一Matrix矩阵计算(基础)。

传送链接:
「SymPy」符号运算(1) 简介/符号/变量/函数/表达式/等式/不等式/运算符
「SymPy」符号运算(2) 各种形式输出、表达式的化简合并与展开
「SymPy」符号运算(3) (非)线性方程(组)求解、数列求和、连乘、求极限
「SymPy」符号运算(4) 微积分与有限差分
「SymPy」符号运算(5) Vector向量及运算

sympy.matrices官方文档1https://docs.sympy.org/latest/tutorials/intro-tutorial/matrices.html?highlight=matrix

创建矩阵

SymPy的矩阵模块具有丰富的矩阵初始化方法,类比于NumPynp.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] 100000001

行向量

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
  1. 单位矩阵:eye(n),单位方阵 n × n n\\times n n×n
  2. 零矩阵:zeros(n),零方阵 n × n n\\times n n×nzeros(n, m),零矩阵 n × m n\\times m n×m
  3. 一矩阵:ones(3),一方阵 n × n n\\times n n×nones(n, m),一矩阵 n × m n\\times m n×m
  4. 对角阵: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 批量替换?

Python的代数符号运算Sympy库的入门文章

将 SymPy 矩阵转换为 numpy 数组/矩阵的最佳方法是啥

Python sympy做代数运算解Cholesky求逆的L和L逆矩阵示例

Python sympy做代数运算解Cholesky求逆的L和L逆矩阵示例

JavaSE基础之矩阵运算