在此示例中,我們將學習使用兩種不同的方法來乘法矩陣:嵌套循環(huán)和嵌套列表理解
要理解此示例,您應(yīng)該了解以下Python編程主題:
在Python中,我們可以將矩陣實現(xiàn)為嵌套列表(列表內(nèi)的列表)。
我們可以將每個元素視為矩陣的一行。
例如X = [[1, 2], [4, 5], [3, 6]]將表示一個3x2矩陣。
第一行可以選擇為X[0]。并且,可以將第一行第一列中的元素選擇為X[0][0]。
僅當X的列數(shù)等于Y的行數(shù)時,才定義兩個矩陣X和Y的乘法。
如果X是一個n X m矩陣,Y是一個m X l矩陣,那么XY是有定義的,它的維數(shù)是n X l(但YX沒有定義)。下面是在Python中實現(xiàn)矩陣乘法的幾種方法。
# 程序使用嵌套循環(huán)將兩個矩陣相乘 # 3x3 matrix X = [[12,7,3], [4 ,5,6], [7 ,8,9]] # 3x4 矩陣 Y = [[5,8,1,2], [6,7,3,0], [4,5,9,1]] # 結(jié)果是 3x4 result = [[0,0,0,0], [0,0,0,0], [0,0,0,0]] # 遍歷X行 for i in range(len(X)): # 遍歷Y列 for j in range(len(Y[0])): # 遍歷Y行 for k in range(len(Y)): result[i][j] += X[i][k] * Y[k][j] for r in result: print(r)
輸出結(jié)果
[114, 160, 60, 27] [74, 97, 73, 14] [119, 157, 112, 23]
在這個程序中,我們使用了嵌套的for循環(huán)來遍歷每一行和每一列。我們在結(jié)果中累加乘積的和。
這種技術(shù)很簡單,但是隨著我們增加矩陣的階數(shù),計算量很大。
對于較大的矩陣操作,我們建議使用優(yōu)化的軟件包,例如NumPy,它比上述代碼快幾倍(大約1000倍)。
# 程序乘兩個矩陣使用列表理解 # 3x3 矩陣 X = [[12,7,3], [4 ,5,6], [7 ,8,9]] # 3x4 矩陣 Y = [[5,8,1,2], [6,7,3,0], [4,5,9,1]] # 結(jié)果是 3x4 result = [[sum(a*b for a,b in zip(X_row,Y_col)) for Y_col in zip(*Y)] for X_row in X] for r in result: print(r)
這個程序的輸出與上面相同。要理解上面的代碼,我們必須首先了解內(nèi)置函數(shù)zip()和使用*運算符解壓縮參數(shù)列表。
我們使用嵌套列表立即來遍歷矩陣中的每個元素。該代碼起初看起來很復雜且不可讀。但是一旦掌握了列表理解的技巧,您可能就不會想使用嵌套循環(huán)了。