最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實現(xiàn)矩陣運算的方法代碼實例

 更新時間:2023年08月23日 09:31:29   作者:「已注銷」  
這篇文章主要介紹了Python實現(xiàn)矩陣運算的方法代碼實例,想用python實現(xiàn)一個矩陣類,它可以像matlab或者numpy中的矩陣一樣進行運算,生成一個矩陣類Matrix之后,他接收一個二維列表作為輸入,然后將對應(yīng)的值寫到矩陣對應(yīng)的位置,需要的朋友可以參考下

Python實現(xiàn)矩陣運算

想用python實現(xiàn)一個矩陣類,它可以像matlab或者numpy中的矩陣一樣進行運算。

所以我考慮了如下幾點

  1. 生成一個矩陣類Matrix之后,他接收一個二維列表作為輸入,然后將對應(yīng)的值寫到矩陣對應(yīng)的位置上;如果輸入為空列表,就返回空矩陣;還要檢查矩陣形狀,如果形狀不是正常的矩陣就拋出異常。
  2. 一般在控制臺中輸入已經(jīng)創(chuàng)建好的矩陣A時,返回的是一個類,我想要向matlab那樣直接顯示矩陣形狀的話,就需要重寫方法__repr__()。
  3. 我還想要直接使用+、-、*來計算兩個矩陣的和,差,矩陣乘積,而不是使用A.add(B)這種麻煩的寫法,就需要使用運算符重載;
  4. 方陣的冪運算,可以采用矩陣快速冪的方法來計算,從而將其重寫冪運算方法__pow__()
  5. 矩陣轉(zhuǎn)置運算,矩陣平鋪展開。
  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:
            # 采用列表推導(dǎo)式的辦法生成矩陣
            # 采用[[0] * other.col ] * self.row)]只是復(fù)制了第一個元素 self.row 遍,都是指向同一個內(nèi)存地址
            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]

還有一些方法,比如計算方陣的行列式,計算矩陣的特征值,特征向量啥的,等把計算方法中關(guān)于這些的算法搞明白了就可以寫了。

到此這篇關(guān)于Python實現(xiàn)矩陣運算的方法代碼實例的文章就介紹到這了,更多相關(guān)Python實現(xiàn)矩陣運算內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python 讀取excel并轉(zhuǎn)換為字典的方法

    Python 讀取excel并轉(zhuǎn)換為字典的方法

    文章介紹了兩種方法使用Python讀取Excel文件并將其轉(zhuǎn)換為字典,方法一使用xlrd庫,方法二使用自定義的xToolkit庫,感興趣的朋友一起看看吧
    2025-03-03
  • Python logging日志模塊使用指南

    Python logging日志模塊使用指南

    Python 的 logging 模塊提供了標準的日志接口,可以通過它存儲各種格式的日志,日志記錄提供了一組便利功能,用于簡單的日志記錄用法,本文就給大家簡單的介紹一下Python logging日志模塊使用方法,需要的朋友可以參考下
    2023-08-08
  • 如何運用python讀寫CSV文件

    如何運用python讀寫CSV文件

    本文通過講解使用基礎(chǔ)Python代碼來讀寫和處理CSV文件,點進來的小伙伴一起來學(xué)習(xí)吧
    2021-08-08
  • Django零基礎(chǔ)入門之模板變量詳解

    Django零基礎(chǔ)入門之模板變量詳解

    這篇文章主要介紹了Django零基礎(chǔ)入門之模板變量詳解,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • python實現(xiàn)整數(shù)序列求和

    python實現(xiàn)整數(shù)序列求和

    這篇文章主要介紹了python實現(xiàn)整數(shù)序列求和,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Python中的jquery PyQuery庫使用小結(jié)

    Python中的jquery PyQuery庫使用小結(jié)

    這篇文章主要介紹了Python中的jquery PyQuery庫使用小結(jié),需要的朋友可以參考下
    2014-05-05
  • Python在groupby分組后提取指定位置記錄方法

    Python在groupby分組后提取指定位置記錄方法

    下面小編就為大家分享一篇Python在groupby分組后提取指定位置記錄方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • matplotlib部件之矩形選區(qū)(RectangleSelector)的實現(xiàn)

    matplotlib部件之矩形選區(qū)(RectangleSelector)的實現(xiàn)

    這篇文章主要介紹了matplotlib部件之矩形選區(qū)(RectangleSelector)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Python wxPython創(chuàng)建文件復(fù)制工具

    Python wxPython創(chuàng)建文件復(fù)制工具

    wxPython是一個功能強大的 GUI 框架,它允許開發(fā)者通過 Python 輕松構(gòu)建跨平臺的桌面應(yīng)用,本文將使用wxPython創(chuàng)建一個文件復(fù)制工具,感興趣的可以了解下
    2025-02-02
  • 基于Python實現(xiàn)繪制簡單動圖的示例詳解

    基于Python實現(xiàn)繪制簡單動圖的示例詳解

    動畫是一種高效的可視化工具,能夠提升用戶的吸引力和視覺體驗,有助于以富有意義的方式呈現(xiàn)數(shù)據(jù)可視化,本文的主要介紹在Python中兩種簡單制作動圖的方法,需要的可以了解下
    2023-10-10

最新評論

宣恩县| 天门市| 天台县| 普定县| 稷山县| 刚察县| 白朗县| 盱眙县| 大新县| 汽车| 涞源县| 东乡族自治县| 余江县| 新巴尔虎左旗| 千阳县| 商都县| 沙坪坝区| 伊吾县| 扶风县| 沙坪坝区| 虹口区| 贺州市| 盐源县| 浦江县| 阳东县| 铜鼓县| 噶尔县| 鞍山市| 梁河县| 成安县| 简阳市| 荣昌县| 博兴县| 得荣县| 固镇县| 铁岭县| 分宜县| 巴彦县| 翼城县| 罗山县| 高台县|