
如果說 Python 在執行速度上不如 C++,那為什麼它能統治資料科學界?答案只有一個:NumPy (Numerical Python)。
NumPy 的底層是用 C 語言寫的,它提供了一個全新的資料結構——ndarray (N-dimensional Array)。這讓我們能在 Python 中寫出簡潔的數學公式,底層卻以 C 的速度在跑。
1. 為什麼 List 不夠用?
如果要將兩個含有 100 萬個數字的列表相加:
import time
import numpy as np
size = 1000000
list1 = range(size)
list2 = range(size)
# 使用 List (慢)
start = time.time()
result = [x + y for x, y in zip(list1, list2)]
print(f"List 花費: {time.time() - start:.4f} 秒")
# 使用 NumPy (快)
arr1 = np.arange(size)
arr2 = np.arange(size)
start = time.time()
result = arr1 + arr2 # 向量化運算
print(f"NumPy 花費: {time.time() - start:.4f} 秒")
結果通常 NumPy 會快 10~50 倍,且語法直觀太多了!
2. 建立 ndarray
import numpy as np
# 從 List 轉換
arr = np.array([1, 2, 3, 4, 5])
# 建立全 0 或全 1 陣列
zeros = np.zeros((3, 3)) # 3x3 矩陣
ones = np.ones((2, 5)) # 2x5 矩陣
# 生成序列 (類似 range,但支援浮點數)
seq = np.arange(0, 10, 0.5)
#隨機陣列
rand = np.random.rand(3, 3) # 0~1 之間的亂數
3. 核心魔法:向量化 (Vectorization) 與 廣播 (Broadcasting)
向量化
你再也不用寫迴圈了!NumPy 會自動將運算應用到每個元素。
arr = np.array([1, 2, 3])
print(arr * 2) # [2, 4, 6]
print(arr ** 2) # [1, 4, 9]
廣播 (Broadcasting)
當兩個陣列形狀不同但「相容」時,NumPy 會自動「擴展」較小的陣列來進行運算。
matrix = np.ones((3, 3))
row = np.array([0, 1, 2])
# row 會被自動複製 3 次,變成 3x3 來跟 matrix 相加
result = matrix + row
print(result)
# [[1., 2., 3.],
# [1., 2., 3.],
# [1., 2., 3.]]
4. 索引與切片 (Indexing & Slicing)
除了標準的 arr[start:end],NumPy 還支援超強的布林索引 (Boolean Indexing)。
arr = np.array([10, 20, 30, 40, 50])
# 找出所有大於 25 的數字
mask = arr > 25
# mask 是 [False, False, True, True, True]
print(arr[mask]) # [30, 40, 50]
# 一行解決
print(arr[arr % 20 == 0]) # [20, 40]
5. 常見統計運算
data = np.random.randn(100) # 100 個常態分佈亂數
print(f"平均值: {data.mean()}")
print(f"標準差: {data.std()}")
print(f"最大值: {data.max()}")
print(f"總和: {data.sum()}")
6. 總結
NumPy 是所有現代 Python 數據堆疊 (Pandas, Matplotlib, Scikit-Learn, PyTorch) 的基石。學好 NumPy,你才能真正看懂資料科學的程式碼。
本章重點回顧:
- ndarray: 高效的多維陣列。
- Vectorization: 消除迴圈,提升效能。
- Broadcasting: 不同形狀陣列間的自動運算。
- Boolean Indexing: 強大的資料篩選功能。
下一章,我們將基於 NumPy,介紹資料科學界真正的霸主——Pandas (Python Data Analysis Library)!
延伸閱讀:
- NumPy 官方教學
- Visual Intro to NumPy (超棒的視覺化教學)