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

这篇具有很好参考价值的文章主要介绍了「SymPy」符号运算(6) 矩阵Matrix及基础运算。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


sympy 矩阵相乘,SymPy符号运算系列,矩阵,python,线性代数

导言

在前几篇文章中,我们学习了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的矩阵模块具有丰富的矩阵初始化方法,类比于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[\begin{matrix}1 & 0 & 0\\0 & 0 & 0\end{matrix}\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[\begin{matrix}1 & 0 & 0\\0 & 0 & 0\\0 & 0 & -1\end{matrix}\right] 100000001

行向量

Matrices也可以创建一维数据集,用两层嵌套列表(两个方括号)创建一行数据得到行向量:

Matrix([[1, 2, 3]])

输出:
[ 1 2 3 ] \left[\begin{matrix}1 & 2 & 3\end{matrix}\right] [123]

列向量

而如果只用一个方括号(没有嵌套的列表)产生一维Matrices,则得到列向量:

Matrix([1, 2, 3])

输出:
[ 1 2 3 ] \left[\begin{matrix}1\\2\\3\end{matrix}\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[\begin{matrix}1 & 2 & 3\\4 & 5 & 6\end{matrix}\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[\begin{matrix}1 & 0 & 0 & 0\\2 & 1 & 0 & 0\\4 & 4 & 1 & 0\\6 & 6 & 6 & 1\end{matrix}\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[\begin{matrix}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\end{matrix}\right] 1000001000001000001000001

zeros(3, 4)

[ 0 0 0 0 0 0 0 0 0 0 0 0 ] \left[\begin{matrix}0 & 0 & 0 & 0\\0 & 0 & 0 & 0\\0 & 0 & 0 & 0\end{matrix}\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 0 0 0 1 ] \left[\begin{matrix}10 & 0 & 0 & 0 & 0\\0 & x & 4 & 0 & 0\\0 & 6 & y & 0 & 0\\0 & 0 & 0 & 1 & 0\\0 & 0 & 0 & 0 & 1\end{matrix}\right] 1000000x60004y000001000001

基本操作

索引

假设有一个 2 × 3 2\times3 2×3的数组, 元素从 1 1 1 6 6 6,由一维数据填充得到:

from sympy.matrices import Matrix
import sympy
M = Matrix(2, 3, [1, 2, 3, 4, 5, 6])

可以通过一维索引,索引到第3个元素4

M[3]
# 输出: 4

也可以通过二维索引,索引到第2行第2列的元素:

M[1, 1]
# 输出: 5

也可以切片,返回一个矩阵类型的副本,原矩阵不受影响

M[0:2, 0:2]

输出:
[ 1 2 4 5 ] \left[\begin{matrix}1 & 2\\4 & 5\end{matrix}\right] [1425]

type(M[0:2, 0:2])
# 输出:sympy.matrices.dense.MutableDenseMatrix

索引不仅可以“查”,也可以“改”,修改矩阵某一个元素为符号 x x x

x = sympy.symbols('x')
M[0] = x
M

输出:
[ x 2 3 4 5 6 ] \left[\begin{matrix}x & 2 & 3\\4 & 5 & 6\end{matrix}\right] [x42536]

增删

除了在初始化部分讲过的添加行/列数据的方式外,还可以通过col_insert()或者row_insert()添加(返回副本)

from sympy.matrices import Matrix
M = Matrix(3, 3, list(range(9)))
M1 = Matrix([100, 101, 102])    # 列向量
M.col_insert(1, M1)

输出:
[ 0 100 1 2 3 101 4 5 6 102 7 8 ] \left[\begin{matrix}0 & 100 & 1 & 2\\3 & 101 & 4 & 5\\6 & 102 & 7 & 8\end{matrix}\right] 036100101102147258

删除行或列(直接在原矩阵上修改,无返回值)

from sympy.matrices import Matrix
import sympy
M = Matrix(([1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]))

删除第0

M.row_del(0)
M

输出:
[ 5 6 7 8 9 10 11 12 13 14 15 16 ] \left[\begin{matrix}5 & 6 & 7 & 8\\9 & 10 & 11 & 12\\13 & 14 & 15 & 16\end{matrix}\right] 5913610147111581216
再删除最后一列:

M.col_del(-1)
M

[ 5 6 7 9 10 11 13 14 15 ] \left[\begin{matrix}5 & 6 & 7\\9 & 10 & 11\\13 & 14 & 15\end{matrix}\right] 59136101471115

  • 合并

有两个矩阵

from sympy.matrices import eye, zeros
M1 = eye(3)			# 3x3
M2 = zeros(3, 4)	# 3x4

他们具有相同的行数,可以按行把它们拼起来

M1.row_join(M2)

[ 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 ] \left[\begin{matrix}1 & 0 & 0 & 0 & 0 & 0 & 0\\0 & 1 & 0 & 0 & 0 & 0 & 0\\0 & 0 & 1 & 0 & 0 & 0 & 0\end{matrix}\right] 100010001000000000000

另外可以用.col_join()函数按列聚合矩阵,不再赘述。

基础运算

算数运算符都可以直接使用:+, -, *, /, **

数与矩阵相乘时是数乘运算,矩阵与矩阵相乘时是矩阵乘法;乘方同理。

栗子:

from sympy.matrices import Matrix
import sympy
M = Matrix(2, 2, [1, 2, 3, 4])
x = sympy.symbols('x')
# 数乘
x*M

输出:
[ x 2 x 3 x 4 x ] \left[\begin{matrix}x & 2 x\\3 x & 4 x\end{matrix}\right] [x3x2x4x]

# 矩阵乘法
M*M		# 或M**2

输出:
[ 7 10 15 22 ] \left[\begin{matrix}7 & 10\\15 & 22\end{matrix}\right] [7151022]
如果相对矩阵内的每个元素做三角函数等特殊函数的运算,可以使用.applyfunc(f)的方法

def f(x):
    return sympy.sin(x)

M.applyfunc(f)

输出:
[ sin ⁡ ( 1 ) sin ⁡ ( 2 ) sin ⁡ ( 3 ) sin ⁡ ( 4 ) ] \left[\begin{matrix}\sin{\left(1 \right)} & \sin{\left(2 \right)}\\\sin{\left(3 \right)} & \sin{\left(4 \right)}\end{matrix}\right] [sin(1)sin(3)sin(2)sin(4)]

向量运算

先定义两个列向量v1, v2

from sympy.matrices import Matrix
import sympy
v1 = Matrix([1,2,3])
v2 = Matrix([4,5,6])
  • 叉乘
v3 = v1.cross(v2)
v3

[ − 3 6 − 3 ] \left[\begin{matrix}-3\\6\\-3\end{matrix}\right] 363

  • 点乘
v1.dot(v2)
# 输出: 32
v1.dot(v3)
# 输出: 0

关于Matrix符号运算与线性代数的内容十分丰富,官方文档中也用了大量篇幅进行讲解,后续将继续介绍…


  1. Meurer A, Smith CP, Paprocki M, Čertík O, Kirpichev SB, Rocklin M, Kumar A, Ivanov S, Moore JK, Singh S, Rathnayake T, Vig S, Granger BE, Muller RP, Bonazzi F, Gupta H, Vats S, Johansson F, Pedregosa F, Curry MJ, Terrel AR, Roučka Š, Saboo A, Fernando I, Kulal S, Cimrman R, Scopatz A. (2017) SymPy: symbolic computing in Python. PeerJ Computer Science 3:e103 https://doi.org/10.7717/peerj-cs.103 ↩︎文章来源地址https://www.toymoban.com/news/detail-624358.html

到了这里,关于「SymPy」符号运算(6) 矩阵Matrix及基础运算的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 求解方程sympy.solve

    【小白从小学Python、C、Java】 【计算机等考+500强证书+考研】 【Python-数据分析】 求解方程 sympy.solve [太阳]选择题 下列代码最后一次输出的结果是? import sympy x = sympy.symbols(\\\'x\\\') y = x**2 + 2*x - 3 print(\\\"【执行】sympy.solve(y, x)\\\") print(sympy.solve(y, x)) A选项:返回结果是一个列表 B选项:

    2024年02月12日
    浏览(38)
  • Python Sympy:解方程利器

    用程序来解决数学问题是非常普遍的,将数学的定理或公式封装成程序中的函数, 只要传入相应的参数,就能让计算机帮我们计算出最终的结果。 不过,今天介绍的这个库:Sympy,它的最大特点是让我们可以用做数学题的思考方式来写程序。 用程序实现数学的算法,会根据

    2024年01月16日
    浏览(39)
  • python数学建模--sympy三维图像绘制

    在求解二元函数最值的时候,我们不知道自己经过若干个步骤求出的结果是否正确,那么我们该怎么办呢?一种办法就是将这个函数的图像绘制出来 三维图像的作用在于,它不仅能让我们直观的看出待求二元函数在指定区间内的形状,而且对于我们求得的最值以及求极值的步

    2024年02月06日
    浏览(67)
  • 14-矩阵相乘及其运算法则

    矩阵与向量的乘法 在这一篇文章中我们就将基于上一篇重新审视矩阵的这个视点来理解矩阵的乘法,那么在这一篇,我们主要来看一下矩阵和向量的乘法。这里这个线性方程组是上一小节给大家举的模拟的一个非常简单的小型经济系统的例子,我们可以把这个经济系统其实本

    2024年02月13日
    浏览(43)
  • python数学建模之用sympy.solve求解方程组的解

    在sympy.solve(expression)方法的帮助下,我们可以很容易地求解数学方程,它将返回使用sympy.solve()方法作为参数提供的方程的根。 参考文档: 参考文档 https://www.geeksforgeeks.org/python-sympy-solve-method/ 在下面这个例子中,我们可以看到通过使用sympy.solve()方法,我们可以求解数

    2024年02月10日
    浏览(41)
  • C语言数据结构课设:矩阵的运算(转置.求和.求差.矩阵相乘.求逆.数乘),文件读取矩阵

      #include stdio.h #include string.h #includestdlib.h #includemath.h // 定义一个结构体类型,表示一个矩阵 typedef struct matrix {     int nrow; // 矩阵的行数     int ncol; // 矩阵的列数     double data[10][10]; // 矩阵的数据,最大为 10 x 10 } matrix; // 定义一个函数,用于显示一个矩阵的内容  void dis

    2024年03月27日
    浏览(58)
  • Jones矩阵符号运算

    有关Jones矩阵、Jones向量的基本原理,可参考这个: 通过Python理解Jones矩阵,本文主要介绍sympy中提供的有关偏振光学的符号计算工具 Jones向量是描述光线偏振状态的重要工具,例如一个偏振角度为 ψ psi ψ 的Jones向量可表示为 J ^ = [ cos ⁡ ψ sin ⁡ ψ ] hat J=begin{bmatrix} cospsi

    2024年04月08日
    浏览(68)
  • FPGA入门系列5--运算符号

    文章简介 本系列文章主要针对FPGA初学者编写,包括FPGA的模块书写、基础语法、状态机、RAM、UART、SPI、VGA、以及功能验证等。将每一个知识点作为一个章节进行讲解,旨在更快速的提升初学者在FPGA开发方面的能力,每一个章节中都有针对性的代码书写以及代码的讲解,可作

    2024年02月07日
    浏览(32)
  • 5.利用matlab完成 符号矩阵的转置和 符号方阵的幂运算(matlab程序)

    1. 简述        Matlab符号运算中的矩阵转置 转置向量或矩阵 B = A.\\\' B = transpose(A) 说明 B = A.\\\' 返回 A 的非共轭转置,即每个元素的行和列索引都会互换。如果 A 包含复数元素,则 A.\\\' 不会影响虚部符号。例如,如果 A(3,2) 是 1+2i 且 B = A.\\\',则元素 B(2,3) 也是 1+2i。 B = transpose(A) 是执

    2024年02月13日
    浏览(48)
  • 4.利用matlab符号矩阵的四则运算(matlab程序)

    1. 简述     符号对象的建立 sym函数 sym函数用于建立单个符号对象,其常用调用格式为: 符号对象名=sym(A) 1 将由A来建立符号对象,其中,A可以是一个数值常量、数值矩阵或数值表达式(不加单引号),此时符号对象为一个符号常量;A也可以是一个变量名(加单引号),这时符号对

    2024年02月13日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包