矩陣乘法是線性代數中的基本運算。
我們通常在許多應用程序中使用它,例如圖像處理、機器學習等等。 NumPy 是一個著名的用於科學計算的 Python 包。
然而,在這篇文章中,我們將研究在不使用 NumPy 的情況下在 Python 中進行矩陣乘法的各種方法。
我們將利用 嵌套循環、內置的 map() 函數和列表理解。
此外,我們還將研究每種策略的優點和缺點,以及何時應用它們。 如果您是線性代數的新手,想了解更多關於矩陣乘法的知識; 繼續閱讀。
我們在哪裡使用矩陣乘法?
矩陣乘法用於 電腦圖像 改變 2D 和 3D 視覺效果。 例如,您可以旋轉、縮放和平移屏幕上的對象。 矩陣在圖像處理中用於將圖片表示為像素陣列。 此外,矩陣可用於進行圖像過濾等操作。
我們還利用矩陣 機器學習. 它們可以幫助我們表示數據和模型參數。 我們可以執行許多操作,例如計算點積和矩陣向量積。
當然,這種操作在科學操作上也是非常有利的。 我們可以在物理和工程中使用它來描述物理量。 因此,我們可以使用向量和張量進行操作。
為什麼我們可能不選擇使用 NumPy?
雖然 NumPy 是一個 Python 庫,它並不總是矩陣乘法的理想選擇。 由於大小和依賴性、學習和遺留系統等原因,我們可能不會選擇使用 NumPy。
在某些情況下,使用 Python 的內置函數或開發自定義代碼可能更有效。 然而,重要的是要注意 NumPy 是一個強大的庫。 此外,您還可以將其用於矩陣乘法。
現在,讓我們看看如何在沒有 NumPy 的情況下實現矩陣乘法。
嵌套循環法
嵌套循環技術使用嵌套循環在 Python 中執行矩陣乘法。 該函數遍歷每個矩陣元素。 並且,它使用一系列嵌套循環將它們相乘。 該函數返回存儲在新矩陣中的結果。
這種方法很容易掌握。 但是,它可能不如其他方式有效,尤其是對於較大的矩陣。 然而,如果您不熟悉線性代數,這對您來說是一個不錯的選擇。
def matrix_multiplication(A, B):
# Determine the matrices' dimensions.
rows_A = len(A)
cols_A = len(A[0])
rows_B = len(B)
cols_B = len(B[0])
# 將結果矩陣設置為零。
result = [[0 for row in range(cols_B)] for col in
range(rows_A)]
# Iterate through rows of A
for s in range(rows_A):
# Iterate through columns of B
for j in range(cols_B):
# Iterate through rows of B
for k in range(cols_A):
result[s][j] += A[s][k] * B[k][j]
return result
讓我們舉一個例子來說明如何做到這一點。 您可以在下面添加這些代碼行來測試這個例子。
# Sample matrices
A = [[1, 4, 3], [4, 9, 6]]
B = [[7, 8], [9, 10], [11, 12]]
# Perform matrix multiplication
result = matrix_multiplication(A, B)
# Print the result
print(result)
# Output: [[76, 84], [175, 194]]
為妳而設的優點:
- 易於理解。
- 非常適合新手或那些尋求更深入理解矩陣乘法的人。
缺點:
- 不如替代技術有效,特別是對於更大的矩陣。
- 它不如其他方法可讀。
map()函數方法
map() 函數方法提供了一種在 Python 中進行矩陣乘法的替代方法。 在這種方法中,我們使用內置的 map() 函數。 因此,我們使用函數式編程工具,將提供的函數應用於每個可迭代元素(列表、元組等)。 此外, map() 函數接受兩個參數,一個函數和一個可迭代對象。 並且,它返回一個將函數應用於每個可迭代元素的迭代器。
在這種方法中,我們遍歷矩陣的每個成員並使用嵌套的 map() 函數進行乘法運算。
zip() 函數用於並行遍歷矩陣的每個元素。
最後,使用 sum() 函數將結果相加。
def matrix_multiplication(A, B):
# To get the dimensions of the matrices
rows_A = len(A)
cols_A = len(A[0])
rows_B = len(B)
cols_B = len(B[0])
# We use map() function for multiplication.
result = [[sum(a * b for a, b in zip(row_a, col_b)) for
col_b in zip(*B)] for row_a in A]
return result
現在,我們可以再次用一個例子來測試我們的代碼。
# Example matrices
A = [[3, 2, 3], [4, 5, 6]]
B = [[7, 8], [9, 10], [11, 12]]
# Use map() function to perform matrix multiplication
result = list(map(lambda x: list(map(lambda y: sum(i*j
for i,j in zip(x,y)), zip(*B))), A))
# Print the result
print(result)
# Output: [[72, 80], [139, 154]]
優點
- 比堆疊循環方法更有效
- 它使用函數式編程來簡化代碼。
弊端
- 一些不熟悉函數式編程的人可能會覺得它的可讀性較差。
- 它比嵌套循環技術更難理解。
列表推導法
列表理解使您能夠在一行代碼中生成一個新列表。 因此,這是通過將表達式應用於現有列表的每個成員來實現的。
在這種方法中,乘法是通過重複遍歷每個矩陣成員來執行的。 我們正在使用分層列表理解。
# Sample matrices
A = [[1, 12, 3], [14, 5, 6]]
B = [[7, 8], [9, 10], [12, 12]]
# Matrix multiplication using list comprehension
result = [[sum(A[i][k] * B[k][j] for k in range(len(A[0])))
for j in range(len(B[0]))] for i in range(len(A))]
# Print the result
print(result)
[[151, 164], [215, 234]]
優點
- 與 map() 函數方法相比,更短且更具可讀性。
弊端
- 它可能不如使用 map() 函數有效,尤其是對於大型矩陣。
- 它比嵌套循環方法更難。
結論
在這篇文章中,我們研究了在 Python 中乘矩陣時使用 NumPy 的替代方法。 我們在嵌套循環、內置 map() 函數和列表理解中執行了矩陣乘法。
最佳策略將取決於項目的特定需求。
每種策略都有其自身的優點和缺點。 為確保函數正常運行,最好添加一些具有各種矩陣維度和值的測試用例。
您還應該包括一些性能測試來比較這些方法的執行情況。
發表評論