在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) = II爲單位矩陣,對角線爲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()計算,僅方陣且行列式非零時存在。

小練習:嘗試對本文中的矩陣AB進行組合操作,例如(A.T @ B).T或驗證A_inv × A是否爲單位矩陣。

掌握這些基礎後,你可以進一步學習矩陣的秩、特徵值等更復雜的線性代數操作。Numpy作爲科學計算的基石,多動手練習是提升熟練度的關鍵!

小夜