在Python的科學計算領域,Numpy是處理矩陣和數組的核心庫。無論是數據分析、機器學習還是線性代數問題,熟練掌握Numpy矩陣操作都是基礎。本文將用最簡單的方式講解矩陣的乘法、轉置與逆矩陣,適合初學者快速上手。
一、Numpy與矩陣基礎¶
首先,確保你已經安裝了Numpy庫(如果沒安裝,可通過pip install numpy安裝)。Numpy提供了高效的多維數組和矩陣操作,其核心是ndarray對象,我們可以把矩陣看作是二維的ndarray。
1. 創建矩陣¶
用np.array()可以直接創建矩陣,只需傳入一個嵌套列表:
import numpy as np
# 創建一個2×2的矩陣
matrix = np.array([[1, 2],
[3, 4]])
print(matrix)
# 輸出:
# [[1 2]
# [3 4]]
2. 矩陣的基本屬性¶
矩陣的形狀(行數、列數)可以通過.shape查看,維度通過.ndim查看(矩陣是二維的,所以ndim=2):
print("形狀:", matrix.shape) # 輸出:形狀: (2, 2)
print("維度:", matrix.ndim) # 輸出:維度: 2
print("數據類型:", matrix.dtype) # 輸出:數據類型: int64
二、矩陣乘法(點積)¶
矩陣乘法是線性代數中最核心的操作之一,需要注意矩陣乘法與普通數乘的區別。
1. 兩種乘法的區別¶
-
元素對應相乘(Element-wise Multiplication):對應位置的元素相乘,在Numpy中用
*實現。但要求兩個矩陣形狀完全相同。 -
矩陣乘法(點積)(Dot Product):數學上要求前一個矩陣的列數等於後一個矩陣的行數(即
m×n矩陣與n×p矩陣相乘,結果爲m×p矩陣)。在Numpy中用np.dot()或@運算符實現。
2. 矩陣乘法實例¶
假設我們有兩個矩陣:
- A = [[1, 2], [3, 4]] (2×2)
- B = [[5, 6], [7, 8]] (2×2)
(1)元素相乘(*)¶
C = A * B # 形狀必須相同,否則報錯
print(C)
# 輸出:
# [[ 5 12]
# [21 32]]
(2)矩陣乘法(np.dot()或@)¶
D = np.dot(A, B) # 等價於 A @ B
print(D)
# 輸出:
# [[19 22]
# [43 50]]
驗證形狀:矩陣乘法後形狀會變成(2,2)(原矩陣都是2×2),如果換成不同形狀:
A = np.array([[1, 2, 3], [4, 5, 6]]) # 2×3矩陣
B = np.array([[7, 8], [9, 10], [11, 12]]) # 3×2矩陣
print(A @ B) # 結果形狀應爲2×2
# 輸出:
# [[ 58 64]
# [139 154]]
三、矩陣轉置¶
矩陣轉置是指將矩陣的行和列互換,數學上記爲A^T(或A.T)。
1. 轉置操作¶
用.T屬性實現轉置,適用於二維矩陣(更高維數組同理):
A = np.array([[1, 2], [3, 4]])
A_T = A.T # 轉置矩陣
print(A_T)
# 輸出:
# [[1 3]
# [2 4]]
轉置的形狀:原矩陣(m,n)轉置後變爲(n,m):
print(A.shape) # 原形狀:(2, 2)
print(A_T.shape) # 轉置後形狀:(2, 2)(因爲原矩陣是方陣)
2. 轉置的應用¶
轉置常用於調整矩陣形狀以適配乘法,例如:
A = np.array([[1, 2], [3, 4], [5, 6]]) # 3×2矩陣
B = np.array([[7, 8, 9], [10, 11, 12]]) # 2×3矩陣
# A和B直接相乘形狀不匹配,但A.T是2×3矩陣,與B的形狀相同
print((A.T @ B).shape) # 結果形狀:(2, 3)
四、逆矩陣¶
逆矩陣是矩陣的“倒數”:如果矩陣A存在逆矩陣A^(-1),則滿足A × A^(-1) = I(I爲單位矩陣,對角線爲1,其餘爲0)。
1. 逆矩陣的前提¶
- 必須是方陣:行數=列數(如2×2、3×3矩陣)。
- 行列式不爲0:行列式可理解爲矩陣的“縮放因子”,爲0時矩陣不可逆。
2. 逆矩陣的Numpy實現¶
用np.linalg.inv()計算逆矩陣,需先導入np.linalg模塊:
A = np.array([[2, 1], [4, 3]]) # 2×2方陣
A_inv = np.linalg.inv(A) # 計算逆矩陣
print(A_inv)
# 輸出:
# [[ 1.5 -0.5]
# [-2. 1. ]]
驗證逆矩陣:用矩陣乘法驗證A × A_inv ≈ I(由於浮點誤差,用np.allclose()更準確):
I = np.eye(2) # 單位矩陣
print(np.allclose(A @ A_inv, I)) # 輸出:True
3. 注意事項¶
- 非方陣沒有逆矩陣,例如
A = np.array([[1, 2], [3, 4], [5, 6]])(3×2矩陣)調用np.linalg.inv(A)會報錯。 - 行列式爲0的矩陣不可逆,例如
A = np.array([[1, 2], [2, 4]])(第二行是第一行的2倍):
det = np.linalg.det(A) # 計算行列式
print(det) # 輸出:0.0(行列式爲0,不可逆)
五、總結與練習¶
本文學習了Numpy中矩陣的三大基礎操作:
- 乘法:區分元素相乘(*)和矩陣點積(np.dot()/@),注意形狀匹配。
- 轉置:用.T實現行變列,適用於調整矩陣形狀。
- 逆矩陣:用np.linalg.inv()計算,僅方陣且行列式非零時存在。
小練習:嘗試對本文中的矩陣A和B進行組合操作,例如(A.T @ B).T或驗證A_inv × A是否爲單位矩陣。
掌握這些基礎後,你可以進一步學習矩陣的秩、特徵值等更復雜的線性代數操作。Numpy作爲科學計算的基石,多動手練習是提升熟練度的關鍵!