Python实现矩阵运算的方法代码实例

 更新时间:2023年08月23日 09:31:29   作者:「已注销」  
这篇文章主要介绍了Python实现矩阵运算的方法代码实例,想用python实现一个矩阵类,它可以像matlab或者numpy中的矩阵一样进行运算,生成一个矩阵类Matrix之后,他接收一个二维列表作为输入,然后将对应的值写到矩阵对应的位置,需要的朋友可以参考下

Python实现矩阵运算

想用python实现一个矩阵类,它可以像matlab或者numpy中的矩阵一样进行运算。

所以我考虑了如下几点

  1. 生成一个矩阵类Matrix之后,他接收一个二维列表作为输入,然后将对应的值写到矩阵对应的位置上;如果输入为空列表,就返回空矩阵;还要检查矩阵形状,如果形状不是正常的矩阵就抛出异常。
  2. 一般在控制台中输入已经创建好的矩阵A时,返回的是一个类,我想要向matlab那样直接显示矩阵形状的话,就需要重写方法__repr__()。
  3. 我还想要直接使用+、-、*来计算两个矩阵的和,差,矩阵乘积,而不是使用A.add(B)这种麻烦的写法,就需要使用运算符重载;
  4. 方阵的幂运算,可以采用矩阵快速幂的方法来计算,从而将其重写幂运算方法__pow__()
  5. 矩阵转置运算,矩阵平铺展开。
  6. 生成元素全为0的矩阵,生成单位矩阵,生成元素全为1的矩阵。
  7. 其它。

不多说了,直接放代码

class Matrix:
    """docstring for Matrix"""
    def __init__(self, elem: list):
        check = [len(item) for item in elem]
        if set(check) == {0}:
            self.elem = []
            self.row = 0
            self.col = 0
        elif len(set(check)) == 1:
            self.elem = elem
            self.row = len(elem)
            self.col = len(elem[0])
        elif len(set(check)) > 1:
            raise ValueError("The column of each row is not equal")
    def __repr__(self):
        mat = ""
        for item in self.elem:
            mat += str(item)
            mat += '\n'
        return str(mat)
    def __iter__(self):
        return iter(self.elem)
    def __add__(self, other):
        if (self.row != other.row) or (self.col != other.col):
            raise TypeError("The two matrix's shape is not equal")
        else:
            new = [[i + j for i, j in zip(A, B)] \
                   for A, B in zip(self.elem, other.elem)]
            return Matrix(new)
    def __mul__(self, other):
        if self.col != other.row:
            raise TypeError("The first column must be equal to the second row")
        else:
            # 采用列表推导式的办法生成矩阵
            # 采用[[0] * other.col ] * self.row)]只是复制了第一个元素 self.row 遍,都是指向同一个内存地址
            new = [[0] * other.col for i in range(self.row)]
            for i in range(self.row):
                for j in range(other.col):
                    for k in range(self.col):
                        new[i][j] += self.elem[i][k] * other.elem[k][j]
            return Matrix(new)
    def __sub__(self, other):
        if (self.row != other.row) or (self.col != other.col):
            raise TypeError("The two matrix's shape is not equal")
        else:
            new = [[i - j for i, j in zip(A, B)] \
                   for A, B in zip(self.elem, other.elem)]
            return Matrix(new)
    def __neg__(self):
        new = [[-i for i in ele] for ele in self.elem]
        return Matrix(new)
    def __pow__(self, power, modulo=None):
        # quick pow
        if not self.is_square():
            raise TypeError("The matrix is not square matrix")
        else:
            new = eyes(self.row)
            A = Matrix(self.elem)
            while power:
                if power & 1:
                    new = new * A
                power >>= 1
                A = A * A
            return new
    def shape(self):
        # 获得矩阵形状
        print((self.row, self.col))
    def is_square(self):
        # 判断是否是方阵
        return self.row == self.col
    def getitem(self, i: int, j: int):
        # 获得矩阵第 (i, j) 个位置的元素
        i -= 1
        j -= 1
        if (i < 0) or (i > self.row) or (j < 0) or (j > self.col):
            raise IndexError("list index out of range")
        else:
            return self.elem[i][j]
    def setitem(self, i: int, j: int, value) -> None:
        # 修改矩阵第 (i, j) 个位置的元素
        i -= 1
        j -= 1
        if (i < 0) or (i > self.row) or (j < 0) or (j > self.col):
            raise IndexError("list index out of range")
        else:
            self.elem[i][j] = value
    def T(self):
        # Transposition
        new = [[0] * self.row for i in range(self.col)]
        for i in range(self.row):
            for j in range(self.col):
                new[j][i] = self.elem[i][j]
        return Matrix(new)
    def tiling(self):
        new = [[x for y in self.elem for x in y]]
        return Matrix(new)
def zeros(row: int, col: int) -> Matrix:
    new = [[0] * col for i in range(row)]
    return Matrix(new)
def eyes(n: int) -> Matrix:
    new = [[0] * n for i in range(n)]
    for i in range(n):
        new[i][i] = 1
    return Matrix(new)
def ones(row: int, col: int) -> Matrix:
    new = [[1] * col for i in range(row)]
    return Matrix(new)

来看看测试

>>> A = Matrix([[1,2,3],[4,5,6],[7,8,9]])
>>> B = ones(3,3)
>>> A
Out[5]: 
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
>>> B
Out[6]: 
[1, 1, 1]
[1, 1, 1]
[1, 1, 1]
>>> A + B
Out[7]: 
[2, 3, 4]
[5, 6, 7]
[8, 9, 10]
>>> A*B
Out[8]: 
[6, 6, 6]
[15, 15, 15]
[24, 24, 24]
>>> A**3
Out[9]: 
[468, 576, 684]
[1062, 1305, 1548]
[1656, 2034, 2412]
>>> A.T()
Out[10]: 
[1, 4, 7]
[2, 5, 8]
[3, 6, 9]
>>> A.tiling()
Out[11]: [1, 2, 3, 4, 5, 6, 7, 8, 9]

还有一些方法,比如计算方阵的行列式,计算矩阵的特征值,特征向量啥的,等把计算方法中关于这些的算法搞明白了就可以写了。

到此这篇关于Python实现矩阵运算的方法代码实例的文章就介绍到这了,更多相关Python实现矩阵运算内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Windows系统下实现pycharm运行.sh文件(本地运行和打开服务器终端)

    Windows系统下实现pycharm运行.sh文件(本地运行和打开服务器终端)

    PyCharm是Python开发的高效率IDE,但是很多时候需要同时开发Bash(shell)脚本,下面这篇文章主要给大家介绍了关于Windows系统下实现pycharm运行.sh文件(本地运行和打开服务器终端)的相关资料,需要的朋友可以参考下
    2022-09-09
  • Pyecharts 绘制3种常用的图形

    Pyecharts 绘制3种常用的图形

    这篇文章主要介绍了Pyecharts 绘制3种常用的图形,上下组合图、左右组合图、一轴多图,下文绘制过程几介绍,需要的小伙伴可以参考一下
    2022-02-02
  • Python PyQt5学习之自定义信号

    Python PyQt5学习之自定义信号

    PyQ5已经自动定义了很多QT自建的信号。但是在实际的使用中为了灵活使用信号与槽机制,可以根据需要自定义信号。本文就将为大家详细讲讲PyQt5自定义信号,感兴趣的可以了解一下
    2022-03-03
  • 如何创建一个Flask项目并进行简单配置

    如何创建一个Flask项目并进行简单配置

    这篇文章主要介绍了如何创建一个Flask项目并进行简单配置,帮助大家更好的理解和学习flask框架,感兴趣的朋友可以了解下
    2020-11-11
  • Python字典深浅拷贝与循环方式方法详解

    Python字典深浅拷贝与循环方式方法详解

    这篇文章主要介绍了Python字典深浅拷贝与循环方式方法详解,需要的朋友可以参考下
    2020-02-02
  • python opencv 批量改变图片的尺寸大小的方法

    python opencv 批量改变图片的尺寸大小的方法

    这篇文章主要介绍了python opencv 批量改变图片的尺寸大小的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • python在每个字符后添加空格的实例

    python在每个字符后添加空格的实例

    今天小编就为大家分享一篇python在每个字符后添加空格的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 分享Python 的24个编程超好用技巧

    分享Python 的24个编程超好用技巧

    这篇文章主要给大家分享Python 的24个编程超好用技巧,下面分享一些python技巧和 tips,这些技巧将根据其首字母按 A-Z 的顺序进行展示,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-02-02
  • Python3获取拉勾网招聘信息的方法实例

    Python3获取拉勾网招聘信息的方法实例

    这篇文章主要给大家介绍了关于Python3获取拉勾网招聘信息的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Python3具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • Python学习之if 条件判断语句

    Python学习之if 条件判断语句

    篇文章主要介绍了Python if 条件判断语句,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-10-10

最新评论