NumPy:深度學習初學者為什麼要先學?
為什麼深度學習初學者應該先學 NumPy?
在大多數深度學習書籍或課程中,PyTorch、TensorFlow 等框架往往是第一個出現的。然而,實際上在構建模型時,往往會遇到以下困惑:
- 「tensor 是什麼?」
- 「shape 不對,為什麼會報錯?」
- 「我以為這樣拼接 batch 就對了…?」
這些混亂大多源於在 未充分理解 NumPy 的情況下直接跳進深度學習框架。因為:
- PyTorch 的
Tensor與 NumPy 的ndarray概念幾乎相同 - 數據預處理、batch 製作、統計計算等仍需要 NumPy 風格的思考
因此,如果你想「真正學好深度學習」,NumPy 可以說是基礎體能的必備項目。
NumPy 是什麼?
NumPy(Numerical Python) 是一個讓 Python 能快速進行數值計算的庫。
核心關鍵字:
- 多維陣列(ndarray):向量、矩陣、tensor 表示的基礎
- 向量化運算:不需要
for循環即可一次性處理大量數據 - 廣播(Broadcasting):即使形狀不同的陣列也能智能運算
- 線性代數運算:矩陣乘、轉置、逆矩陣等
- 隨機模組:資料抽樣、正態分佈、隨機初始化等
幾乎所有深度學習公式都歸結為「向量與矩陣運算」,因此能熟練使用 NumPy 就等於掌握了深度學習的語言。
Python 列表 vs NumPy 陣列
先簡單比較 Python 基本列表與 NumPy 陣列的差異:
# Python 基本列表
a = [1, 2, 3, 4]
b = [10, 20, 30, 40]
# 列表相加
print(a + b)
# 結果: [1, 2, 3, 4, 10, 20, 30, 40] (連接)
列表的 + 是「連接」而不是「逐元素相加」。
import numpy as np
a = np.array([1, 2, 3, 4])
b = np.array([10, 20, 30, 40])
print(a + b)
# 結果: [11 22 33 44] (逐元素相加)
NumPy 陣列的 + 與數學中的逐元素運算一致,深度學習框架的 Tensor 也沿用這種風格。
向量化:減少迴圈,像數學公式寫程式
深度學習代碼中常被建議 最小化 for 循環,改用 向量化。
範例:對所有元素取平方。
Python 列表 + for 循環
data = [1, 2, 3, 4, 5]
squared = []
for x in data:
squared.append(x ** 2)
print(squared) # [1, 4, 9, 16, 25]
NumPy 向量化
import numpy as np
data = np.array([1, 2, 3, 4, 5])
squared = data ** 2
print(squared) # [ 1 4 9 16 25]
- 代碼更短
- 更接近數學表達
- 內部使用 C 實現,性能更佳
PyTorch、TensorFlow 的 tensor 運算同樣採用這種 NumPy 風格的向量化。
廣播:形狀不同也能一起運算
廣播是 自動將不同形狀的陣列對齊 的規則。
範例:給每個樣本加上一個相同的常數向量。
import numpy as np
x = np.array([[1, 2, 3],
[4, 5, 6]]) # shape: (2, 3)
b = np.array([10, 20, 30]) # shape: (3,)
y = x + b
print(y)
# [[11 22 33]
# [14 25 36]]
NumPy 會把 b 先「擴展」成 (1, 3) 再「擴展」到 (2, 3) 進行運算。
PyTorch 也同樣適用:
import torch
x = torch.tensor([[1, 2, 3],
[4, 5, 6]])
b = torch.tensor([10, 20, 30])
y = x + b
print(y)
掌握廣播規則後,PyTorch 的 tensor 運算會更自然。
向量、矩陣、tensor:用 NumPy 表示深度學習
在深度學習中常見的概念對應於 NumPy:
- 向量(vector):1 維陣列 →
shape: (N,) - 矩陣(matrix):2 維陣列 →
shape: (M, N) - tensor:3 維以上陣列
- 例:圖像批次
batch_size = 32,灰階 28x28 圖像 →shape: (32, 28, 28)
簡單矩陣乘法範例:
import numpy as np
# 輸入向量(3 個特徵)
x = np.array([1.0, 2.0, 3.0]) # shape: (3,)
# 權重矩陣(輸入 3 → 輸出 2)
W = np.array([[0.1, 0.2, 0.3],
[0.4, 0.5, 0.6]]) # shape: (2, 3)
# 矩陣乘:y = W @ x
y = W @ x
print(y) # [1.4 3.2]
這相當於計算一個單層線性層。轉換到 PyTorch 只需改用 torch.tensor,結果相同。
NumPy 與 PyTorch 的關係
1. Tensor 與 ndarray 是「表兄」
- 都是 n 維陣列 + 向量化運算
shape、reshape、transpose、sum、mean等函式名稱與行為極為相似
因此許多人把 NumPy 視為「PyTorch tensor 的練習場」。
2. 數據預處理通常採用 NumPy
深度學習專案常見流程:
- 讀取 CSV、影像、日誌等多種資料
- 轉為數值型
- 正規化、標準化、切片、打亂、分批
這些工作大多使用 NumPy + pandas 完成。
import numpy as np
import torch
# NumPy 中準備資料
np_data = np.random.randn(100, 3) # 100 個樣本,3 個特徵
# 轉為 PyTorch tensor
tensor_data = torch.from_numpy(np_data).float()
print(tensor_data.shape) # torch.Size([100, 3])
反之,將 PyTorch tensor 再轉回 NumPy 也很常見:
y = tensor_data.mean(dim=0) # PyTorch tensor
y_np = y.detach().cpu().numpy()
實務上 NumPy 與 PyTorch 互相往來。
3. GPU 計算是 PyTorch,概念練習是 NumPy
- PyTorch tensor 可在 GPU(CUDA)上運行,並支援自動微分
- NumPy 只在 CPU 上執行,但 概念上更簡單,適合練習與除錯
常見開發流程:
- 用 NumPy 先驗證想法或公式
- 成功後再轉換為 PyTorch 代碼
深度學習中常用的 NumPy 範例
1. 隨機初始化 & 加噪聲
import numpy as np
# 權重初始化(正態分佈)
W = np.random.randn(3, 3) * 0.01
# 對輸入加噪聲
x = np.array([1.0, 2.0, 3.0])
noise = np.random.normal(0, 0.1, size=x.shape)
x_noisy = x + noise
2. 數據正規化(均值 0,標準差 1)
X = np.random.randn(100, 3) * 10 + 50 # 隨機資料
mean = X.mean(axis=0)
std = X.std(axis=0)
X_norm = (X - mean) / (std + 1e-8)
3. One-hot 編碼
num_classes = 4
labels = np.array([0, 2, 1, 3])
one_hot = np.eye(num_classes)[labels]
print(one_hot)
# [[1. 0. 0. 0.]
# [0. 0. 1. 0.]
# [0. 1. 0. 0.]
# [0. 0. 0. 1.]]
4. 分批處理
X = np.random.randn(100, 3)
batch_size = 16
for i in range(0, len(X), batch_size):
batch = X[i:i+batch_size]
# 這裡可以把 batch 傳給模型
這個模式與 PyTorch 的 DataLoader 完全對應。
學習 NumPy 時必須掌握的重點
- ndarray 基礎:
np.array、dtype、shape、reshape、astype - 索引 & 切片:
x[0]、x[1:3]、x[:, 0]、x[:, 1:3]、布林索引x[x > 0] - 基本運算:
+ - * / **、比較運算、np.sum、np.mean、axis概念 - 線性代數:矩陣乘
@或np.dot、轉置x.T - 廣播:標量、(N, D)+(D,)、(N,1) 等模式
- 隨機函式:
np.random.randn、np.random.randint、np.random.permutation - PyTorch 連結:
torch.from_numpy、tensor.numpy()、shape的對應
掌握以上內容後,PyTorch 教程中的大多數 tensor 運算都會變得自然。
總結:NumPy 是「深度學習語法書」
- NumPy 是 數值計算的多維陣列庫
- PyTorch 的
Tensor其實是 NumPyndarray的深度學習版 - 透過 向量化、廣播、線性代數 的練習,能減少 shape 錯誤、輕鬆將論文公式轉碼、提升資料前處理與分析能力
若你想從「框架使用」轉向「數學與陣列運算」的角度理解深度學習,NumPy 是最佳起點。

目前沒有評論。