Python 資料科學基石:NumPy 陣列運算 (第 26 章)

站主自己的課程,請大家支持
揭秘站長的架站心法:如何利用 Hugo × AI 打造高質感個人品牌網站? 揭秘站長的架站心法:如何利用 Hugo × AI 打造高質感個人品牌網站?
  • Post by
  • Jan 09, 2024
post-thumb

如果說 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)


延伸閱讀

LATEST POST
TAG