目录

  • 导言
  • 创建矩阵
    • 列表初始化
      • 行向量
      • 列向量
    • 维度和数集
    • 二元函数
      • `lambda`函数
    • 特殊矩阵
  • 基本操作
    • 索引
    • 增删
    • 基础运算
    • 向量运算

导言

在前几篇文章中,我们学习了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] [10​00​00​]
如果用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] ​100​000​00−1​ ​

行向量

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

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

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

列向量

而如果只用一个方括号(没有嵌套的列表)产生一维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] [14​25​36​]

二元函数

假设我们想要创建的矩阵为 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 1elif a > b:return 2 * aelse: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] ​1246​0146​0016​0001​ ​

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×n;zeros(n, m),零矩阵 n × m n\times m n×m
  3. 一矩阵:ones(3),一方阵 n × n n\times n n×n;ones(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] ​10000​01000​00100​00010​00001​ ​

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] ​000​000​000​000​ ​

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] ​100000​0x600​04y00​00010​00001​ ​

基本操作

索引

假设有一个 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] [14​25​]

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] [x4​25​36​]

增删

除了在初始化部分讲过的添加行/列数据的方式外,还可以通过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] ​036​100101102​147​258​ ​

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

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] ​5913​61014​71115​81216​ ​
再删除最后一列:

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] ​5913​61014​71115​ ​

  • 合并

有两个矩阵

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] ​100​010​001​000​000​000​000​ ​

另外可以用.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] [x3x​2x4x​]

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

输出:
[ 7 10 15 22 ] \left[\begin{matrix}7 & 10\\15 & 22\end{matrix}\right] [715​1022​]
如果相对矩阵内的每个元素做三角函数等特殊函数的运算,可以使用.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] ​−36−3​ ​

  • 点乘
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 ↩︎

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

  1. 「SymPy」符号运算(7) Matrix进阶运算与线性代数

    目录 0 导言 1 矩阵一般属性 秩 逆 迹 转置 共轭 伴随 行列式 特征值 特征向量 特征多项式 2 矩阵运算与线性代数 范数 标准化 条件数 矩阵分解 黑塞矩阵 雅克比矩阵 Jordan标准型 ...

  2. 「SymPy」符号运算(5) Vector向量及运算

    目录 导言 坐标系和向量 笛卡尔坐标系与向量 坐标原点 向量运算 四则运算 点乘.叉乘 并矢/外积(Dyadic) ∇ \nabla ∇算子(Hamiltonian算子) 梯度 旋度 散度 向量操作 ...

  3. 「SymPy」符号运算(3) (非)线性方程(组)求解、数列求和、连乘、求极限

    目录 导言 解方程(组) solve函数 solveset函数 求和 ∑ \sum ∑ 连乘 ∏ \prod ∏ 求函数极限 求数列极限 导言 在前两篇文章中,我们学习了SymPy的输入输出.基本符号 ...

  4. 「SymPy」符号运算(4) 微积分与有限差分

    目录 导言 积分 不定积分 定积分 多重积分 求导 一阶导数 高阶导数 偏导数 有限差分 常微分差分 差分系数 高阶差分 偏微分差分 导言 在前几篇中,我们学习了SymPy的基本语法.方程求解等基础知 ...

  5. 「SymPy」符号运算(2) 各种形式输出、表达式的化简合并与展开

    目录 导言 输出 替换.演化 化简.合并与展开 化简 展开 合并 `cancel`函数 `apart`函数 `rewrite`函数 `expand_func`函数 导言 在前一篇文章中,我们简单学习了 ...

  6. 「SymPy」符号运算(1) 简介/符号/变量/函数/表达式/等式/不等式/运算符

    目录 1 简介 2 导入库 3 定义符号 4 定义函数 5 表达式 6 等式/不等式 7 `SymPy`假设与限制 8 运算符/函数 常用运算符/函数 数学常数 三角函数 复杂函数 指数运算 1 简介 ...

  7. 「SymPy」实战之Maxwell分布律分子最概然、均方根与平均速率

    目录 0 导言 1 Maxwell速度分布律 2 SymPy推导特征速度 2.1 导入库和方法 2.2 初始化输出 2.3 定义符号 2.4 设置符号替换 2.5 定义分布律 2.6 分布律作图 2. ...

  8. LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配

    #2006. 「SCOI2015」小凸玩矩阵 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 小 ...

  9. 页面元素之「¥」符号的使用原则和技巧

    转载自公众号:一鸣说 作者:一鸣 十二赞产品经理 在做页面设计的时候,难免需要展示「金额」.「价格」等跟钱有关的元素.有的时候需要在表示「钱」的数字前放上 ¥ 符号,有的时候不放,那么在使用的时候有什 ...

最新文章

  1. 计算机视觉系统中图像究竟经历了哪些“折磨”
  2. python手机版ios-使用Python写iOS自动化测试
  3. Android项目:使用pulltorefresh开源项目扩展为下拉刷新上拉加载更多的处理方法,监听listview滚动方向...
  4. 在同一台服务器上启动多个 FreeSWITCH 实例
  5. python sklearn库 rnn_如何使用Tensorflow计算RNN和LSTM模型的AUC并生成ROC曲线?
  6. vector的学习(系统的学习)
  7. windows下文件系统格式介绍
  8. go 变量大写_golang学习笔记(一):包,变量,函数
  9. STM32驱动LCD1602,哪位同学需要的,来了
  10. Verilog——格雷码和二进制码转换的Verilog实现
  11. MySQL图书馆借书管理系统试题
  12. 用C语言画空心三角形
  13. 【转发】相似性度量学习及其在计算机视觉中的应用
  14. SVG进阶-sprite 雪碧图
  15. python 爬取懂车帝详情页“全部车型模块信息”
  16. jzyz 1225 调查干草
  17. Typora使用方法
  18. 3166: [Heoi2013]Alo
  19. C/C++ 打印三角形
  20. 一个简单HTML5期末考核大作业,学生个人html静态网页制作代码

热门文章

  1. spring-data-jpa specification 复杂查询之 zuji-jpa
  2. (折扣计算)需求说明:普通顾客购物满100元打9折;会员购物打8折;会员购物满200元打7.5折(判断语句if-else和switch语句的嵌套结构)
  3. 前端给map集合增加数据
  4. 想看临床医学直播?这几个平台值得收藏
  5. [CS231n Assignment #1] 简单图像分类器——高级图像特征分类
  6. vue使用echats
  7. 程序猿媛都偷偷深爱的九大习惯
  8. matlab三相变压器的导纳模型,电力系统分析matlab.ppt
  9. java model.put_java-Restful PUT方法的ModelAttribute未填充值(JSO...
  10. 关于像素、分辨率、PPI、DPI等概念的分析