📜  SymPy-矩阵

📅  最后修改于: 2020-11-05 04:44:59             🧑  作者: Mango


在数学中,矩阵是数字,符号或表达式的二维数组。矩阵处理的理论涉及在遵守某些规则的情况下对矩阵对象执行算术运算。

线性变换是矩阵的重要应用之一。许多与物理学特别相关的科学领域都使用矩阵相关的应用程序。

SymPy软件包具有处理矩阵处理的矩阵模块。它包括Matrix类,其对象表示一个矩阵。

注意:如果要单独执行本章中的所有代码片段,则需要导入矩阵模块,如下所示:

>>> from sympy.matrices import Matrix

>>> from sympy.matrices import Matrix 
>>> m=Matrix([[1,2,3],[2,3,1]]) 
>>> m
$\displaystyle \left[\begin{matrix}1 & 2 & 3\\2 & 3 & 1\end{matrix}\right]$

在Python shell中执行上述命令时,将生成以下输出-

[1 2 3 2 3 1]

矩阵是从适当大小的List对象创建的。您还可以通过按指定的行数和列数分配列表项来获得矩阵。

>>> M=Matrix(2,3,[10,40,30,2,6,9]) 
>>> M
$\displaystyle \left[\begin{matrix}10 & 40 & 30\\2 & 6 & 9\end{matrix}\right]$

在Python shell中执行上述命令时,将生成以下输出-

[10 40 30 2 6 9]

矩阵是可变对象。矩阵模块还提供ImmutableMatrix类,用于获取不可变矩阵。

基本操作

Matrix对象的shape属性返回其大小。

>>> M.shape

上面代码的输出如下-

(2,3)

row()和col()方法分别返回指定编号的行或列。

>>> M.row(0)
$\displaystyle \left[\begin{matrix}10 & 40 & 30\end{matrix}\right]$

上面代码的输出如下-

[10 40 30]

>>> M.col(1)
$\displaystyle \left[\begin{matrix}40\\6\end{matrix}\right]$

上面代码的输出如下-

[40 6]

使用Python的slice运算符可获取一个或多个属于行或列的项目。

>>> M.row(1)[1:3]
[6, 9]

Matrix类具有row_del()和col_del()方法,可从给定的矩阵中删除指定的行/列-

>>> M=Matrix(2,3,[10,40,30,2,6,9]) 
>>> M.col_del(1) 
>>> M

在Python shell中执行上述命令时,将生成以下输出-

Matrix([[10, 30],[ 2, 9]])

您可以使用以下命令将样式应用于输出-

$\displaystyle \left[\begin{matrix}10 & 30\\2 & 9\end{matrix}\right]$

执行上面的代码段后,您将获得以下输出:

[10 30 2 9]

>>> M.row_del(0) 
>>> M

$\displaystyle \left[\begin{matrix}2 & 9\end{matrix}\right]$

执行上面的代码段后,您将获得以下输出:

[2 9]

同样,row_insert()和col_insert()方法在指定的行或列索引处添加行或列

>>> M1=Matrix([[10,30]]) 
>>> M=M.row_insert(0,M1)
>>> M

$\displaystyle \left[\begin{matrix}10 & 30\\2 & 9\end{matrix}\right]$

执行上面的代码段后,您将获得以下输出:

[10 40 30 2 9]

>>> M2=Matrix([40,6]) 
>>> M=M.col_insert(1,M2) 
>>> M

$\displaystyle \left[\begin{matrix}10 & 40 & 30\\2 & 6 & 9\end{matrix}\right]$

执行上面的代码段后,您将获得以下输出:

[10 40 30 6 9]

算术运算

定义了常用的+,-和*运算符,用于执行加法,减法和乘法。

>>> M1=Matrix([[1,2,3],[3,2,1]]) 
>>> M2=Matrix([[4,5,6],[6,5,4]]) 
>>> M1+M2

$\displaystyle \left[\begin{matrix}5 & 7 & 9\\9 & 7 & 5\end{matrix}\right]$

执行上面的代码段后,您将获得以下输出:

[5 7 9 9 7 5]

>>> M1-M2
$\displaystyle \left[\begin{matrix}-3 & -3 & -3\\-3 & -3 & -3\end{matrix}\right]$

执行上面的代码段后,您将获得以下输出:

[-3 -3 -3 -3 -3 -3]

仅在以下情况下才可以进行矩阵乘法:-第一个矩阵的列数必须等于第二个矩阵的行数。 -结果将具有与第一个矩阵相同的行数和与第二个矩阵相同的列数。

>>> M1=Matrix([[1,2,3],[3,2,1]]) 
>>> M2=Matrix([[4,5],[6,6],[5,4]]) 
>>> M1*M2
$\displaystyle \left[\begin{matrix}31 & 29\\29 & 31\end{matrix}\right]$

上面代码的输出如下-

[31 29 29 31]

>>> M1.T
$\displaystyle \left[\begin{matrix}1 & 3\\2 & 2\\3 & 1\end{matrix}\right]$

执行代码后,获得以下输出-

[1 3 2 2 3 1]

要计算矩阵的行列式,请使用det()方法。行列式是可以从方矩阵的元素计算出的标量值。0

>>> M=Matrix(3,3,[10,20,30,5,8,12,9,6,15])
>>> M
$\displaystyle \left[\begin{matrix}10 & 20 & 30\\5 & 8 & 12\\9 & 6 & 15\end{matrix}\right]$

上面代码的输出如下-

[10 20 30 5 8 12 9 6 15]

>>> M.det()

上面代码的输出如下-

-120

矩阵构造器

SymPy提供了许多特殊类型的矩阵类。例如,身份矩阵,全零和一的矩阵等。这些类分别命名为eye,零和一。单位矩阵是一个正方形矩阵,其中对角线上的元素设置为1,其余元素为0。

from sympy.matrices import eye eye(3)

输出

Matrix([[1, 0, 0], [0, 1, 0], [0, 0, 1]])
$\displaystyle \left[\begin{matrix}1 & 0 & 0\\0 & 1 & 0\\0 & 0 & 1\end{matrix}\right]$

上面代码的输出如下-

[1 0 0 0 1 0 0 0 1]

在诊断矩阵中,对角线上的元素根据提供的参数进行初始化。

>>> from sympy.matrices import diag 
>>> diag(1,2,3)

$\displaystyle \left[\begin{matrix}1 & 0 & 0\\0 & 2 & 0\\0 & 0 & 3\end{matrix}\right]$

上面代码的输出如下-

[1 0 0 0 2 0 0 0 3]

零矩阵中的所有元素都初始化为0。

>>> from sympy.matrices import zeros 
>>> zeros(2,3)

$\displaystyle \left[\begin{matrix}0 & 0 & 0\\0 & 0 & 0\end{matrix}\right]$

上面代码的输出如下-

[0 0 0 0 0 0]

同样,一个是矩阵,所有元素都设置为1。

>>> from sympy.matrices import ones
>>> ones(2,3)

$\displaystyle \left[\begin{matrix}1 & 1 & 1\\1 & 1 & 1\end{matrix}\right]$

上面代码的输出如下-

[1 1 1 1 1 1]