NumPy:深度學習初學者為什麼要先學?

為什麼深度學習初學者應該先學 NumPy?



在大多數深度學習書籍或課程中,PyTorch、TensorFlow 等框架往往是第一個出現的。然而,實際上在構建模型時,往往會遇到以下困惑:

  • 「tensor 是什麼?」
  • 「shape 不對,為什麼會報錯?」
  • 「我以為這樣拼接 batch 就對了…?」

這些混亂大多源於在 未充分理解 NumPy 的情況下直接跳進深度學習框架。因為:

  • PyTorch 的 TensorNumPy 的 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 維陣列 + 向量化運算
  • shapereshapetransposesummean 等函式名稱與行為極為相似

因此許多人把 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 上執行,但 概念上更簡單,適合練習與除錯

常見開發流程:

  1. 用 NumPy 先驗證想法或公式
  2. 成功後再轉換為 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.arraydtypeshapereshapeastype
  • 索引 & 切片x[0]x[1:3]x[:, 0]x[:, 1:3]、布林索引 x[x > 0]
  • 基本運算+ - * / **、比較運算、np.sumnp.meanaxis 概念
  • 線性代數:矩陣乘 @np.dot、轉置 x.T
  • 廣播:標量、(N, D)+(D,)、(N,1) 等模式
  • 隨機函式np.random.randnnp.random.randintnp.random.permutation
  • PyTorch 連結torch.from_numpytensor.numpy()shape 的對應

掌握以上內容後,PyTorch 教程中的大多數 tensor 運算都會變得自然。


總結:NumPy 是「深度學習語法書」

  • NumPy 是 數值計算的多維陣列庫
  • PyTorch 的 Tensor 其實是 NumPy ndarray 的深度學習版
  • 透過 向量化、廣播、線性代數 的練習,能減少 shape 錯誤、輕鬆將論文公式轉碼、提升資料前處理與分析能力

若你想從「框架使用」轉向「數學與陣列運算」的角度理解深度學習,NumPy 是最佳起點

image of a dev researching deep-learning