• 5.6Python数据处理篇之Sympy系列(六)---矩阵的操作


    目录

    前言

    今天我们学习的是,有关sympy的矩阵操作

    对应官方的:Matrices

    官方教程
    https://docs.sympy.org/latest/tutorial/matrices.html
    参考网站
    https://junjiecai.github.io/posts/2017/Jan/30/sympy_intro_3/

    (一)矩阵的创建-Matrix()

    1.说明:

    Matrix(list),使用list来确定矩阵的维度。

    2.源代码:

    from sympy import *
    
    # 一纬矩阵
    m1 = Matrix([1, 2, 3])
    
    #二维矩阵
    m2 = Matrix([[1, -1], [3, 4], [0, 2]])
    
    
    print(latex(m1))
    print(latex(m2))
    

    3.输出:

    [left[egin{matrix}1\2\3end{matrix} ight] ]

    [left[egin{matrix}1 & -1\3 & 4\0 & 2end{matrix} ight] ]

    01.png

    (二)常用的构造矩阵

    1.说明:

    可以使用sympy自带的方法来快速的构造常用矩阵

    1. 单位矩阵:eye()
    2. 零矩阵:zeros()
    3. 一矩阵:ones()
    4. 对角矩阵:diag()

    2.源代码:

    from sympy import *
    
    # 单位矩阵
    m1 = eye(3)
    print(latex(m1))
    
    # 零矩阵
    m2 = zeros(3, 4)
    print(latex(m2))
    
    # 一矩阵
    m3 = ones(3, 4)
    print(latex(m3))
    
    # 对角矩阵
    m4 = diag([1, 2, 3])
    print(latex(m4))
    

    3.输出:

    单位矩阵

    [left[egin{matrix}1 & 0 & 0\0 & 1 & 0\0 & 0 & 1end{matrix} ight] ]

    零矩阵

    [left[egin{matrix}0 & 0 & 0 & 0\0 & 0 & 0 & 0\0 & 0 & 0 & 0end{matrix} ight] ]

    一矩阵

    [left[egin{matrix}1 & 1 & 1 & 1\1 & 1 & 1 & 1\1 & 1 & 1 & 1end{matrix} ight] ]

    对角矩阵

    [left[egin{matrix}1 & 0 & 0\0 & 2 & 0\0 & 0 & 3end{matrix} ight] ]

    02.png

    (三)基本操作

    1.说明:

    基本操作有以下几个:

    1. 获取形状:.shape()
    2. 获得单行与单列:.row(n) .col(n)
    3. 删除行与列:row_del(n) .col_del(n)
    4. 插入新行与列:.row_insert(pos, M) .col_insert(pos, M)
    5. 对矩阵求转置:m.T

    2.源代码:

    from sympy import *
    
    m = Matrix([[1, -1], [3, 4], [0, 2]])
    # 矩阵
    print(m)
    
    # 获得形状
    print(m.shape)
    
    # 获得单行与单列
    print(m.row(0))
    print(m.col(0))
    
    # 删除行与列
    m.row_del(0)
    print("删除第一行后:", m)
    
    m.col_del(0)
    print("删除第一列后:", m)
    print(m)
    
    # 插入新的行与列
    m2 = Matrix([[2, 3]])
    print("m2:", m2)
    
    m2 = m2.row_insert(1, Matrix([[0, 4]]))
    print("插入新行后:", m2)
    
    m2 = m2.col_insert(2, Matrix([9, 8]))
    print("插入新列后:", m2)
    
    # 求逆矩阵
    print("其逆矩阵是:", m2.T)
    

    3.输出:

    [m = left[egin{matrix}1 & -1\3 & 4\0 & 2end{matrix} ight] ]

    其形状是:(3, 2)

    第一行是:

    [left[egin{matrix}1 & -1end{matrix} ight] ]

    第一列是:

    [left[egin{matrix}1\3\0end{matrix} ight] ]

    删除第一行后:

    [left[egin{matrix}3 & 4\0 & 2end{matrix} ight] ]

    删除第一列后:

    [left[egin{matrix}4\2end{matrix} ight] ]

    [m2 = left[egin{matrix}2 & 3end{matrix} ight] ]

    插入一行是:

    [left[egin{matrix}2 & 3\0 & 4end{matrix} ight] ]

    插入一列是:

    [left[egin{matrix}2 & 3 & 9\0 & 4 & 8end{matrix} ight] ]

    其转转置矩阵是:

    [left[egin{matrix}2 & 3 & 9\0 & 4 & 8end{matrix} ight] ]

    03.png

    (四)矩阵的运算

    1.加减法

    (1)说明:

    sympy里的加减法,直接使用+ -即可

    (2)源代码:

    from sympy import *
    
    M = Matrix([1, 2, 3])
    
    N = Matrix([4, 5, 6])
    
    # 加法与减法
    
    print("M+N:", M+N)
    print("M-N:", M-N)
    

    (3)输出效果:

    [M = left[egin{matrix}1\2\3end{matrix} ight] ]

    [N = left[egin{matrix}4\5\6end{matrix} ight] ]

    [M + N =left[egin{matrix}5\7\9end{matrix} ight] ]

    [M - N = left[egin{matrix}-3\-3\-3end{matrix} ight] ]

    04.png

    2.乘法与求逆

    (1)说明:

    乘法:*

    求逆矩阵:M**(-1)

    (2)源代码:

    from sympy import *
    
    M = Matrix([[1, -1, 1], [2, 3, -2]])
    N = Matrix([[1, 2], [2, 1], [1, 1]])
    
    # 求乘法
    print(M*N)
    
    # 求逆矩阵
    m = Matrix([[1, 3], [-2, 3]])
    print(m**(-1))
    

    (3)输出效果:

    [M = left[egin{matrix}1 & -1 & 1\2 & 3 & -2end{matrix} ight] ]

    [N = left[egin{matrix}1 & 2\2 & 1\1 & 1end{matrix} ight] ]

    [M*N = left[egin{matrix}0 & 2\6 & 5end{matrix} ight] ]

    [m = left[egin{matrix}1 & 3\-2 & 3end{matrix} ight] ]

    [m^{-1} = left[egin{matrix}frac{1}{3} & - frac{1}{3}\frac{2}{9} & frac{1}{9}end{matrix} ight] ]

    05.png

    (五)行列式

    1.说明:

    1. 求行列式:M.det()
    2. 求阶梯矩阵:M.rref()
    3. 求特征值与向量:M.eignvals()

    2.源代码:

    from sympy import *
    
    
    M = Matrix([[1, 0, 1], [2, -1, 3], [4, 3, 2]])
    
    # 求行列式
    print("行列式:", M.det())
    
    # 求阶梯行列式
    print("阶梯行列式:", M.rref())
    
    
    # 求特征值与特征向量
    M = Matrix([[3, -2,  4, -2], [5,  3, -3, -2], [5, -2,  2, -2], [5, -2, -3,  3]])
    print("特征值与特征向量: ", M.eigenvals())
    

    3.输出:

    [egin{vmatrix}1 & 0 & 1\2 & -1 & 3\4 & 3 & 2end{vmatrix}=1 ]

    [M = left[egin{matrix}1 & 0 & 1\2 & -1 & 3\4 & 3 & 2end{matrix} ight] ]

    M的阶梯矩阵:

    [left ( left[egin{matrix}1 & 0 & 0\0 & 1 & 0\0 & 0 & 1end{matrix} ight], quad left ( 0, quad 1, quad 2 ight ) ight ) ]

    另一个M矩阵:

    [M = left[egin{matrix}3 & -2 & 4 & -2\5 & 3 & -3 & -2\5 & -2 & 2 & -2\5 & -2 & -3 & 3end{matrix} ight] ]

    其特征值是:

    [left { -2 : 1, quad 3 : 1, quad 5 : 2 ight } ]

    06.png

    (六)对角化矩阵

    1.说明:

    如果要对角化一个矩阵,用diagonalize()

    2.源代码:

    from sympy import *
    
    M = Matrix([[3, -2,  4, -2], [5,  3, -3, -2], [5, -2,  2, -2], [5, -2, -3,  3]])
    
    P, D = M.diagonalize()
    
    print('矩阵M')
    print(M)
    
    print('矩阵P')
    print(P)
    
    print('矩阵D')
    print(D)
    
    print("P*D*P**-1")
    print(P*D*P**-1)
    

    3.输出:

    [M = left[egin{matrix}3 & -2 & 4 & -2\5 & 3 & -3 & -2\5 & -2 & 2 & -2\5 & -2 & -3 & 3end{matrix} ight] ]

    [ P = left[egin{matrix}0 & 1 & 1 & 0\1 & 1 & 1 & -1\1 & 1 & 1 & 0\1 & 1 & 0 & 1end{matrix} ight] ]

    [D = left[egin{matrix}-2 & 0 & 0 & 0\0 & 3 & 0 & 0\0 & 0 & 5 & 0\0 & 0 & 0 & 5end{matrix} ight] ]

    (PDP^{−1}=)

    [left[egin{matrix}3 & -2 & 4 & -2\5 & 3 & -3 & -2\5 & -2 & 2 & -2\5 & -2 & -3 & 3end{matrix} ight] ]

    07.png

    作者:Mark

    日期:2019/03/18 周一

  • 相关阅读:
    常见apache问题
    机器学习——SVM讲解
    剑指offer——05用两个栈实现队列(Python3)
    剑指offer——04重建二叉树(Python3)
    剑指offer——03从尾至头打印列表(Python3)
    剑指offer——02替换空格(Python3)
    剑指offer——01二维数组中的查找(Python3)
    剑指offer——06旋转数组的最小数字(Python3)
    一个Python项目的创建架构
    python中各项目文件含义(新手可看)
  • 原文地址:https://www.cnblogs.com/zyg123/p/10554686.html
Copyright © 2020-2023  润新知