114學年度下學期|電腦程式與計算分析(二)CP & CA
WEEK 4 必考 NOTE:NumPy 入門(四)
高分必過重點整理 💻🐍🧮一句話主線
Week 4 的核心,是把 NumPy 從「會建立陣列」提升到「會做真正的陣列運算與資料處理」,重點放在 indexing、slicing、broadcasting、聚合統計、矩陣運算與常見錯誤排查。
1) 這週在學什麼?
如果前幾週的 NumPy 已經讓你熟悉:
- np.array()
- 陣列形狀 shape
- 基本索引
- 基本四則運算
那麼到了 Week 4,通常就會更進一步進入真正常考的主題:
- 進階 indexing / slicing
- broadcasting 廣播機制
- 聚合函數 aggregation
- 二維陣列運算
- 矩陣乘法
- 條件篩選
- 常見資料處理模板
這週最重要的不是背 API,而是理解一句話:
NumPy 的強大,不在於你會一個一個元素慢慢處理,而在於你能直接對整個陣列操作。
2) Week 4 最重要的主線
這週可以濃縮成一句話:
把 Python 的逐項迴圈思維,轉成 NumPy 的整批向量化思維。
所以你要特別熟悉五件事:
(1) 陣列切片
知道如何正確取列、取欄、取子矩陣。
(2) broadcasting
知道不同形狀陣列怎麼自動對齊運算。
(3) 聚合統計
像是 sum()、mean()、max()、min()、std()。
(4) 條件篩選
用布林陣列過濾資料。
(5) 矩陣運算
知道逐元素乘法和矩陣乘法不同。
3) 必考主題 A:NumPy 陣列切片與索引
1. 一維陣列索引
import numpy as np
a = np.array([10, 20, 30, 40, 50]) print(a[0]) # 10
print(a[-1]) # 50
print(a[1:4]) # [20 30 40]
必考觀念
- 索引從 0 開始
- a[1:4] 代表第 1 到第 3 個位置
- 右邊不包含 4
2. 二維陣列索引
A = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]) print(A[0, 1]) # 2
print(A[2, 2]) # 9
必考觀念
二維陣列的格式是:
A[列, 欄]
不是 A[列][欄] 才能用,但 A[列, 欄] 更標準、更快。
3. 取整列、整欄
print(A[0, :]) # 第 0 列 → [1 2 3]
print(A[:, 1]) # 第 1 欄 → [2 5 8]
必考觀念
- : 代表全部
- A[0, :] 是第 0 列全部
- A[:, 1] 是第 1 欄全部
4. 取子矩陣
print(A[0:2, 1:3])
輸出:
[[2 3]
[5 6]]
必考觀念
這題很常考:
- 前面 0:2 控制列
- 後面 1:3 控制欄
5. 必考陷阱
陷阱 A:列欄順序寫反
A[列, 欄] 不要寫成 A[欄, 列]
陷阱 B:切片右邊不包含
0:2 只到 1,不包含 2
陷阱 C:一維與二維觀念混淆
A[:, 1] 取的是一整欄,不是一個元素
4) 必考主題 B:NumPy 向量化運算
1. 為什麼 NumPy 快?
因為它不是靠 Python 的 for 逐個算,而是直接對整個陣列運算。
2. 基本四則運算
a = np.array([1, 2, 3])
b = np.array([4, 5, 6]) print(a + b) # [5 7 9]
print(a - b) # [-3 -3 -3]
print(a * b) # [ 4 10 18]
print(a / b)
必考觀念
這裡的 * 是:
逐元素相乘
不是矩陣乘法。
3. 常數對整個陣列運算
a = np.array([1, 2, 3])
print(a + 10) # [11 12 13]
print(a * 2) # [2 4 6]
print(a ** 2) # [1 4 9]
必考觀念
NumPy 可以直接對整個陣列加、減、乘、除,不用寫迴圈。
4. 常見數學函數
a = np.array([1, 4, 9])
print(np.sqrt(a)) # [1. 2. 3.]
print(np.exp(a)) print(np.log(a))
5. 必考陷阱
陷阱 A:把 * 當矩陣乘法
在 NumPy 中,* 預設是逐元素乘法。
陷阱 B:形狀不同不能亂算
不是所有 shape 都能直接加減乘除。
5) 必考主題 C:Broadcasting 廣播機制
1. 什麼是 broadcasting?
當兩個陣列 shape 不同,但符合 NumPy 規則時,會自動擴展後再運算。
這是 NumPy 超重要考點。
2. 最基本例子
a = np.array([1, 2, 3])
print(a + 10)
這裡 10 會自動被廣播成:
[10, 10, 10]
所以結果是:
[11, 12, 13]
3. 一維加二維
A = np.array([
[1, 2, 3],
[4, 5, 6]
]) b = np.array([10, 20, 30]) print(A + b)
輸出:
[[11 22 33]
[14 25 36]]
必考觀念
b 會自動對每一列加上去。
4. 欄向量 broadcasting
A = np.array([
[1, 2, 3],
[4, 5, 6]
]) c = np.array([[100], [200]])
print(A + c)
輸出:
[[101 102 103]
[204 205 206]]
必考觀念
這次是每一列加不同值,因為 c 是欄向量形狀 (2,1)。
5. broadcasting 規則簡述
從尾端開始比 shape:
- 相同 → 可以
- 其中一個是 1 → 可以擴展
- 其他情況 → 不行
6. 必考陷阱
陷阱 A:不知道為什麼 shape 不同還能算
因為 broadcasting 在背後自動擴展。
陷阱 B:以為所有不同 shape 都能算
不對,還要符合規則。
陷阱 C:列向量和欄向量搞混
(3,)、(1,3)、(3,1) 不一樣。
6) 必考主題 D:聚合函數 Aggregation
1. 最常考的聚合函數
a = np.array([1, 2, 3, 4, 5])
print(np.sum(a)) # 15
print(np.mean(a)) # 3.0
print(np.max(a)) # 5
print(np.min(a)) # 1
print(np.std(a)) # 標準差
2. 二維陣列的 axis
這是超高頻重點。
A = np.array([
[1, 2, 3],
[4, 5, 6]
]) print(np.sum(A)) # 全部加總 = 21
print(np.sum(A, axis=0)) # 每欄加總 = [5 7 9]
print(np.sum(A, axis=1)) # 每列加總 = [6 15]
3. axis 意義
axis=0
沿著列方向往下加,結果保留欄
→ 常理解成「每欄統計」
axis=1
沿著欄方向往右加,結果保留列
→ 常理解成「每列統計」
4. 經典題型
題型 1:每列平均
print(np.mean(A, axis=1))
題型 2:每欄最大值
print(np.max(A, axis=0))
5. 必考陷阱
陷阱 A:axis=0 和 axis=1 搞反
這是最常見失分點。
陷阱 B:忘記不寫 axis 就是全體一起算
7) 必考主題 E:條件篩選與布林陣列
1. 條件判斷可以直接作用在陣列上
a = np.array([1, 2, 3, 4, 5])
print(a > 3)
輸出:
[False False False True True]
2. 用布林陣列篩選
a = np.array([1, 2, 3, 4, 5])
print(a[a > 3]) # [4 5]
必考觀念
先產生條件,再把條件當索引。
3. 複合條件
a = np.array([1, 2, 3, 4, 5, 6])
print(a[(a > 2) & (a < 6)]) # [3 4 5]
4. 常見題型
題型 1:取偶數
print(a[a % 2 == 0])
題型 2:取大於平均值
mean_val = np.mean(a)
print(a[a > mean_val])
5. 必考陷阱
陷阱 A:複合條件要用 &、|
NumPy 不用 Python 的 and、or
陷阱 B:條件要加括號
例如:
(a > 2) & (a < 6)
8) 必考主題 F:矩陣乘法與轉置
1. 轉置 transpose
A = np.array([
[1, 2, 3],
[4, 5, 6]
]) print(A.T)
輸出:
[[1 4]
[2 5]
[3 6]]
2. 矩陣乘法
方法 1:@
A = np.array([[1, 2],
[3, 4]])
B = np.array([[5, 6], [7, 8]])
print(A @ B)
方法 2:np.dot()
print(np.dot(A, B))
3. 和逐元素乘法比較
print(A * B) # 逐元素乘法
print(A @ B) # 矩陣乘法
這兩個絕對不能混。
4. 必考陷阱
陷阱 A:把 * 當矩陣乘法
陷阱 B:矩陣 shape 不相容
矩陣乘法要滿足內維度一致。
9) Week 4 必考範例題
範例 1:建立陣列、切片、加總
import numpy as np
A = np.array([ [2, 4, 6],
[1, 3, 5],
[7, 8, 9]
]) print("第 2 列 =", A[1, :])
print("第 3 欄 =", A[:, 2])
print("左上 2x2 子矩陣 =")
print(A[0:2, 0:2]) print("每列總和 =", np.sum(A, axis=1))
print("每欄總和 =", np.sum(A, axis=0))
重點
這題整合了:
- 二維索引
- slicing
- axis=0
- axis=1
範例 2:broadcasting
import numpy as np
A = np.array([ [1, 2, 3],
[4, 5, 6]
]) b = np.array([10, 20, 30]) print("A + b =") print(A + b)
重點
這題是最標準 broadcasting 範例。
範例 3:條件篩選
import numpy as np
a = np.array([5, 8, 12, 3, 7, 10]) print("大於 7 的元素 =", a[a > 7])
print("偶數元素 =", a[a % 2 == 0])
print("介於 5 與 10 之間 =", a[(a >= 5) & (a <= 10)])
重點
這題整合了:
- 布林陣列
- 條件篩選
- 複合條件
範例 4:矩陣乘法與逐元素乘法比較
import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print("逐元素乘法 =")
print(A * B) print("矩陣乘法 =")
print(A @ B)
重點
這題超常考觀念:
- *
- @
範例 5:統計分析
import numpy as np
scores = np.array([ [80, 75, 90],
[85, 88, 92],
[78, 82, 84]
]) print("全部平均 =", np.mean(scores))
print("每位學生平均 =", np.mean(scores, axis=1))
print("每科平均 =", np.mean(scores, axis=0))
print("最高分 =", np.max(scores))
print("每科最高分 =", np.max(scores, axis=0))
重點
這題就是期中期末最常見的資料分析模板。
10) 本週最容易失分的地方
1. axis=0 和 axis=1 搞混
這是第一大失分點。
2. * 和 @ 混淆
逐元素乘法和矩陣乘法差很多。
3. broadcasting 不理解 shape
不知道為什麼能算,或不知道為什麼不能算。
4. 複合條件用錯 and
NumPy 要用 & 和 |。
5. 切片列欄順序寫反
A[列, 欄] 一定要穩。
11) 考前速讀清單
考前 10 分鐘至少看這些:
一定要會
- A[列, 欄]
- A[:, 1]
- A[0:2, 1:3]
- np.sum(A, axis=0)
- np.sum(A, axis=1)
- A + b 的 broadcasting
- a[a > 3]
- A * B
- A @ B
一定要記
- axis=0 → 每欄
- axis=1 → 每列
- * → 逐元素
- @ → 矩陣乘法
- 複合條件用 &、|
12) 本週 1 分鐘速讀版
Week 4 的核心,是把 NumPy 從基本建立陣列,提升到真正能做資料處理與矩陣運算。
重點要掌握二維索引、切片、broadcasting、聚合函數、條件篩選與矩陣乘法。
考試最常輸的不是不會函數,而是 axis 搞反、* 和 @ 混淆、或布林條件寫錯。
真正高分關鍵,是看到資料就能直接用陣列思維整批處理,而不是退回 Python 逐項迴圈。
13) 一句收尾
Week 4 真正的高分關鍵,不是記住更多語法,而是你能不能開始用 NumPy 的向量化思維直接處理整批資料。












