把資料裝進陣列:NumPy

先備知識 P3 — 選讀,不列入評分
ndarray|shape 與 ndim|reshape 與資料共用|布林索引|廣播|axis=0 是往下摺|default_rng(種子)
向下捲動開始互動↓
📌 本頁使用方式(先備 · NumPy 陣列)

① 依序閱讀:每節先讀說明;遇到互動元件時,先預測結果,再操作驗證。 ② 對照程式範例:程式碼卡下方的「來源」標了課程練習筆記本(lab);需要實作時,再打開原始筆記本對照。 ③ 檢查理解:答錯時先看回饋,再回到相關說明;標為延伸的內容可留待第二輪。 ④ 最後翻關鍵詞彙卡自測術語,並用 重點速查與來源查閱。

教科書:An Introduction to Statistical Learning with Applications in Python(ISLP)。章節旁的來源標記可點到本頁書目。

CONTENTS · 內容目錄
PROLOGUE · 開場

串列加串列是接起來,陣列加陣列才是逐元素相加 課程 Lab Ch2 · lab 範例

統計程式經常需要對一整排數字做同一個運算。 算殘差是每一筆都減掉擬合值,算標準化是每一筆都減平均再除標準差。 Python 內建的串列(list)做不到這件事。它的 + 是「接起來」,不是「加起來」。

一句話 串列的 + 是串接,陣列的 + 是逐元素相加。NumPy 讓這類整排數值運算更容易表達。
›按「切換」看同一組數字在兩種容器裡的行為。
課程/lab 資料
兩種 +
上排是串列:x + y 把 y 接在 x 後面,長度變成 6。
下排是陣列:x + y 把對齊的元素相加,長度還是 3。
目前的結果
x + y(串列)—
x + y(陣列)—
長度—
為什麼串列要這樣設計
串列裝的東西可以是任何型別,數字、字串、另一個串列混在一起都行,所以「相加」對它沒有意義,只能定義成串接。陣列規定整塊都是同一個型別,才談得上逐元素運算。
串列的 + 是串接
x = [3, 4, 5] x y = [4, 9, 7] x + y
預期輸出
[3, 4, 5, 4, 9, 7]

注意輸出是 [3, 4, 5, 4, 9, 7],六個元素,不是三個。

來源:Ch02-statlearn-lab-zh.ipynb
陣列的 + 是逐元素相加
x = np.array([3, 4, 5]) y = np.array([4, 9, 7]) x + y
預期輸出
array([ 7, 13, 12])

同一組數字,換成 np.array 之後 + 的意思就變了。

來源:Ch02-statlearn-lab-zh.ipynb
常見疑問
那我可以只用 pandas,不學 NumPy 嗎?
學會 NumPy 的陣列概念,也有助於理解 pandas。DataFrame 的每一欄底下就是一個 NumPy 陣列,df['mpg'].mean() 走的是 NumPy 的路。pandas 管理欄名與索引,數值運算則會用到 NumPy。
陣列比串列快在哪裡?
兩件事。一是記憶體連續:整塊同型別的數字排在一起,CPU 一次抓一批;串列存的是一堆指標,每個元素都要再跳一次。二是迴圈在 C 裡面跑:x**2 不會回到 Python 逐個平方。
PART 01 · 建立陣列與 shape

ndim、dtype、shape:一個陣列的三個身分證欄位 課程 Lab Ch2 · lab 範例

讀取陣列時,先看三個屬性:ndim(幾維)、dtype(裝什麼型別)、 shape(每一維多長)。看不懂錯誤訊息的時候,先印出這三個屬性,確認維度、型別與形狀。

先記這一條 shape 是一個 tuple。二維陣列的 shape 是 (列數, 欄數),列在前、欄在後。
建立二維陣列
x = np.array([[1, 2], [3, 4]]) x
預期輸出
array([[1, 2],
       [3, 4]])
來源:Ch02-statlearn-lab-zh.ipynb
三個基本屬性
x.ndim x.dtype x.shape
預期輸出
2
dtype('int64')
(2, 2)
來源:Ch02-statlearn-lab-zh.ipynb
dtype 會被最寬的元素決定 np.array([[1, 2], [3.0, 4]]) 裡只要有一個浮點數,整塊就變成 float64——陣列不允許同一塊裡混型別。想指定就寫 np.array([[1, 2], [3, 4]], float)。
PART 01 · 自我檢測

X.shape 是 (10, 3),這個陣列是什麼?

(A) 10 個變數、每個變數 3 筆觀測
(B) 一個 10 維陣列,每一維長度 3
(C) 10 列 3 欄:10 筆觀測、每筆 3 個變數

先決定點數,還是先決定間距?

np.linspace(start, stop, num) 指定點數,預設包含兩端; np.arange(start, stop, step) 指定間距,採含頭不含尾的範圍。

兩個序列的右端點不同
seq1 = np.linspace(0, 10, 11) seq1 seq2 = np.arange(0, 10) seq2
預期輸出
array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
來源:Ch02-statlearn-lab-zh.ipynb

例如前者在 0 到 10 放 11 個點,所以包含 10;後者使用預設間距 1,最後是 9。 linspace(..., endpoint=False) 可排除右端。 浮點間距累加會受捨入影響;畫固定數量的網格時,通常直接指定 linspace 的點數較清楚。

延伸:NumPy linspace 的端點與點數定義。

PART 02 · reshape 與轉置

reshape 給的是同一塊資料的另一種看法 課程 Lab Ch2 · lab 範例

本例的 reshape 可以用同一塊記憶體的另一種讀法完成: 六個數字排成一排,或排成兩列三欄,底下是同一塊。一般情況則是能共用就回傳檢視,否則可能複製。若沒注意這個差別, 之後修改一個變數時,可能漏看另一個變數也受到影響。

›選一個形狀,看六個數字怎麼被重新分行。
課程/lab 資料
拖或按都可以
按下方的形狀按鈕,看同樣六個數字被切成不同的樣子。注意數字的順序從頭到尾沒變,變的只是換行的位置。
目前狀態
shape(6,)
ndim1
讀法一排六個
C 順序(row-major)
NumPy 預設先填滿一列再換下一列。所以 reshape((2, 3)) 得到的第一列是前三個數字,不是每隔一個取一次。
reshape 成兩列三欄
x = np.array([1, 2, 3, 4, 5, 6]) print('beginning x:\n', x) x_reshape = x.reshape((2, 3)) print('reshaped x:\n', x_reshape)
預期輸出
beginning x:
 [1 2 3 4 5 6]
reshaped x:
 [[1 2 3]
 [4 5 6]]
來源:Ch02-statlearn-lab-zh.ipynb
完整實驗:修改共用資料前後的輸出
改 reshape 出來的元素,原陣列也會變
print('x before we modify x_reshape:\n', x) print('x_reshape before we modify x_reshape:\n', x_reshape) x_reshape[0, 0] = 5 print('x_reshape after we modify its top left element:\n', x_reshape) print('x after we modify top left element of x_reshape:\n', x)
預期輸出
x before we modify x_reshape:
 [1 2 3 4 5 6]
x_reshape before we modify x_reshape:
 [[1 2 3]
 [4 5 6]]
x_reshape after we modify its top left element:
 [[5 2 3]
 [4 5 6]]
x after we modify top left element of x_reshape:
 [5 2 3 4 5 6]

這就是「同一塊記憶體」的證據:改 x_reshape[0, 0],x 的第一個元素跟著變成 5。

來源:Ch02-statlearn-lab-zh.ipynb
shape、ndim 與轉置
x_reshape.shape, x_reshape.ndim, x_reshape.T
預期輸出
((2, 3),
 2,
 array([[5, 4],
        [2, 5],
        [3, 6]]))

.T 同樣不搬資料,它只是把「先走列還是先走欄」對調。

來源:Ch02-statlearn-lab-zh.ipynb
觀念釐清
什麼時候會真的複製一份?
基本切片(A[1:3])給的是檢視(view);reshape 則在可行時共用資料,否則可能複製。花式索引(用整數串列或布林陣列去挑,例如 A[[1,3]])與明確呼叫 .copy() 才會複製。需要獨立資料時,明確使用 .copy()。
為什麼 reshape 要傳一個 tuple?
因為形狀本來就是一個 tuple。x.reshape((2, 3)) 與 x.reshape(2, 3) 都可以,前者跟 shape 屬性的寫法一致,讀起來比較不會誤會。
PART 02 · 自我檢測

x = np.array([1,2,3,4,5,6])、y = x.reshape((2,3)),接著執行 y[0,0] = 99。x[0] 現在是多少?

(A) 還是 1,y 是新的陣列
(B) 99,因為 y 跟 x 共用同一塊資料
(C) 會報錯,view 不能改
🔗 這在本站哪一章會用到 把單一特徵交給 sklearn 時,可用 reshape(-1, 1) 保留二維形狀;第 12 章做主成分之前要先把資料中心化,靠的就是這裡的 shape 對齊。→ P6 · reshape 的操作範例 → 線性迴歸 · 多元迴歸
PART 03 · 索引、切片與子矩陣

用 A[[1,3],[0,2]] 理解成對索引 課程 Lab Ch2 · lab 範例

記憶體也有差別:基本切片可共享原陣列,整數陣列的進階索引會建立複本。對本頁連續儲存的 A,reshape 可以共享資料;需要獨立修改時應明確複製。

同時指定列與欄時,要看清楚索引如何配對。lab 裡有一格叫 「糟糕——發生了什麼?」,因為 A[[1,3],[0,2]] 拿到的 不是 第 1、3 列與第 0、2 欄交叉的那個 2×2 子矩陣。

›先自己猜哪幾格會亮,再按按鈕。
課程/lab 資料
四種寫法
按按鈕切換寫法,被選到的格子會亮起來。A[[1,3],[0,2]] 亮的只有兩格——它把兩個索引串列配對成 (1,0) 與 (3,2)。
這個寫法拿到什麼
寫法A
結果 shape(4, 4)
拿到的值全部
要子矩陣就用 np.ix_
np.ix_([1,3],[0,2]) 明講「這兩組是要交叉的」,或者分兩步 A[[1,3]][:,[0,2]]。兩種都對,np.ix_ 少複製一次。
先做一個 4×4 的 A
A = np.array(np.arange(16)).reshape((4, 4)) A
預期輸出
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
來源:Ch02-statlearn-lab-zh.ipynb
挑列、挑欄
A[[1,3]] A[:,[0,2]]
預期輸出
array([[ 4,  5,  6,  7],
       [12, 13, 14, 15]])
array([[ 0,  2],
       [ 4,  6],
       [ 8, 10],
       [12, 14]])

單獨挑列或單獨挑欄都很直覺,問題出在兩個一起寫。

來源:Ch02-statlearn-lab-zh.ipynb
糟糕——發生了什麼?
A[[1,3],[0,2]]
預期輸出
array([ 4, 14])

只拿到兩個數字:A[1,0] 與 A[3,2]。兩個索引串列被逐位配對,不是交叉。

來源:Ch02-statlearn-lab-zh.ipynb
延伸:索引錯誤與其他子矩陣寫法
長度不一樣就直接報錯
A[[1,3],[0,2,3]]
錯誤訊息
IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (2,) (3,)

錯誤訊息裡的 could not be broadcast together 已經在暗示:花式索引走的是廣播規則,不是交叉。

來源:Ch02-statlearn-lab-zh.ipynb
真的要子矩陣:兩種寫法
A[[1,3]][:,[0,2]] idx = np.ix_([1,3],[0,2,3]) A[idx]
預期輸出
array([[ 4,  6],
       [12, 14]])
array([[ 4,  6,  7],
       [12, 14, 15]])

A[[1,3]][:,[0,2]] 會產生一個中間陣列;np.ix_ 可一次指定列與欄的索引。

來源:Ch02-statlearn-lab-zh.ipynb
等距切片也能取子矩陣
A[1:4:2,0:3:2]
預期輸出
array([[ 4,  6],
       [12, 14]])

切片是 起:迄:步長,迄不包含。1:4:2 取到第 1、3 列,0:3:2 取到第 0、2 欄。

來源:Ch02-statlearn-lab-zh.ipynb
PART 03 · 自我檢測

想從 A 取出「第 0、2 列」與「第 1、3 欄」交叉的 2×2 子矩陣,下列哪一個不會給你想要的東西?

(A) A[np.ix_([0,2],[1,3])]
(B) A[[0,2]][:,[1,3]]
(C) A[[0,2],[1,3]]
PART 04 · 布林索引

用一排 True/False 挑列:統計程式最常見的選取法 課程 Lab Ch2 · lab 範例

統計程式常依條件選取資料: 「馬力大於 150 的那些車」「訓練集的那些列」。做法是先算出一排 True/False, 再拿它去索引。這排布林值的長度必須跟那一維一樣長。

布林索引與整數索引不一樣 A[np.array([0,1,0,1])] 是整數索引,意思是「第 0、1、0、1 列」,會拿到四列而且有重複;A[np.array([False,True,False,True])] 才是布林索引,拿到兩列。長得很像,結果差很多。
›拖動門檻線,看遮罩怎麼變。
概念示意
拖門檻
拖那條線,看有多少列被留下。左邊是每一列的值,右邊亮起來的是 值 > 門檻 為 True 的列。
目前
門檻8
遮罩—
留下幾列—
比較迴圈與布林遮罩
布林遮罩可以直接表達整組資料的篩選規則。集中寫出篩選條件,也方便看出選取規則,半年後回來看還讀得懂。
做一個布林遮罩
keep_rows = np.zeros(A.shape[0], bool) keep_rows keep_rows[[1,3]] = True keep_rows
預期輸出
array([False, False, False, False])
array([False,  True, False,  True])

np.zeros(n, bool) 開一排 False,再把要的位置設成 True。

來源:Ch02-statlearn-lab-zh.ipynb
整數索引 vs 布林索引
A[np.array([0,1,0,1])] A[keep_rows]
預期輸出
array([[0, 1, 2, 3],
       [4, 5, 6, 7],
       [0, 1, 2, 3],
       [4, 5, 6, 7]])
array([[ 4,  5,  6,  7],
       [12, 13, 14, 15]])

同樣是 [0,1,0,1],型別不同結果就不同:整數版拿到四列(還重複了),布林版拿到兩列。

來源:Ch02-statlearn-lab-zh.ipynb
延伸:布林遮罩與子矩陣
布林也能配 np.ix_ 取子矩陣
keep_cols = np.zeros(A.shape[1], bool) keep_cols[[0, 2, 3]] = True idx_bool = np.ix_(keep_rows, keep_cols) A[idx_bool]
預期輸出
array([[ 4,  6,  7],
       [12, 14, 15]])
來源:Ch02-statlearn-lab-zh.ipynb
PART 04 · 自我檢測

Auto 有 392 列。mask = Auto['mpg'] > 30 之後,mask 的長度是多少?

(A) 符合條件的筆數,例如 89
(B) 392,每一列一個 True 或 False
(C) 1,因為它是一個條件

一整排條件,如何變成一個答案?

比較陣列會得到一排布林值;np.all 問「是否全部成立」,np.any 問「是否至少一個成立」。 它們把多個真假值歸約成單一判斷,也能用 axis 分別判斷每列或每欄。

每個位置都相同嗎?
np.all(keep_rows == np.array([0,1,0,1]))
預期輸出
np.True_
來源:Ch02-statlearn-lab-zh.ipynb

上例的 True 只代表逐元素值相等;整數陣列與布林陣列仍有不同的索引語意。 對布林值 [True, False],all 為 False,any 為 True。 不要直接把含多個元素的陣列放入 if;先說清楚你要「全部」還是「至少一個」。

PART 05 · 廣播

形狀不一樣也能相加:右對齊、補 1、拉伸 NumPy 文件 · 廣播規則課程 Lab Ch2 · lab 範例

形狀不一樣的兩個陣列也能相加,NumPy 會照一套固定規則把它們對齊,這叫廣播 (broadcasting)。標準化資料 (X - X.mean(0)) / X.std(0) 就是靠它—— 左邊是 (10, 3),右邊是 (3,),形狀不同卻能直接相減。

廣播三步驟 ① 右對齊兩個 shape;② 缺的維度補 1;③ 長度是 1 的維度拉伸到對方的長度。任何一維兩邊既不相等、也沒有一邊是 1,就報錯。
›選一組 shape,再按單步。
概念示意
一步一步看
按「單步」走完三個步驟。紅色代表這一維對不上、會報錯;綠色代表這一維可以拉伸。
目前
A 的 shape(10, 3)
B 的 shape(3,)
結果—
為什麼標準化寫得出來
X.mean(0) 的 shape 是 (3,),右對齊補成 (1, 3),再把第一維拉伸成 10——等於每一列都減同一組欄平均,正是我們要的。
最單純的廣播:陣列與純量
np.sqrt(x) x**2
預期輸出
array([2.23606798, 1.41421356, 1.73205081, 2.        , 2.23606798,
       2.44948974])
array([25,  4,  9, 16, 25, 36])

x**2 的 2 是純量,shape 是 (),被拉伸成跟 x 一樣長。這也是廣播的用法。

來源:Ch02-statlearn-lab-zh.ipynb
A 的 shapeB 的 shape結果為什麼
(10, 3)(3,)(10, 3)右對齊補成 (1,3),第一維 1→10
(10, 3)(10, 1)(10, 3)第二維 1→3
(10, 3)(10,)✗ 報錯右對齊後是 (1,10),第二維 3 vs 10 對不上
(10, 3)(10, 3)(10, 3)完全一樣,不用拉伸
減欄平均要小心方向 X - X.mean(0) 對,因為 (3,) 會對到欄。但 X - X.mean(1) 會報錯——(10,) 右對齊之後跑去對欄了。要減列平均得寫 X - X.mean(1, keepdims=True),或 X - X.mean(1)[:, None]。
PART 06 · 彙總與 axis

axis=0 是往下摺、axis=1 是往右摺 課程 Lab Ch2 · lab 範例

理解 axis 時,可以先看彙總沿著哪一維進行: axis 指的是「被摺掉」的那一維。 X.mean(0) 摺掉第 0 維(列),剩下每一欄一個平均。

›先猜結果的 shape,再按按鈕。
課程/lab 資料
看箭頭的方向
按按鈕切換 axis。箭頭是「加總掃過去」的方向,被掃掉的那一維就消失了。
目前
呼叫X.mean(0)
摺掉哪一維列(axis 0)
結果 shape(3,)
keepdims 是什麼
加了 keepdims=True,被摺掉的那一維會留下長度 1,(10,3) 摺 axis 0 得到 (1,3) 而不是 (3,)。這樣廣播回去就不會對錯邊。
完整實作:變異數的三種等價計算
變異數的三種寫法會一致
rng = np.random.default_rng(3) y = rng.standard_normal(10) np.mean(y), y.mean() np.var(y), y.var(), np.mean((y - y.mean())**2)
預期輸出
(np.float64(-0.1126795190952861), np.float64(-0.1126795190952861))
(np.float64(2.7243406406465125),
 np.float64(2.7243406406465125),
 np.float64(2.7243406406465125))

np.var 預設除以 n(不是 n−1),所以它跟np.mean((y - y.mean())**2) 完全相同。要不偏估計得寫 np.var(y, ddof=1)。第 2 章會再遇到這件事。

來源:Ch02-statlearn-lab-zh.ipynb
標準差就是變異數開根號
np.sqrt(np.var(y)), np.std(y)
預期輸出
(np.float64(1.6505576756498128), np.float64(1.6505576756498128))
來源:Ch02-statlearn-lab-zh.ipynb
沿 axis=0 取欄平均
X = rng.standard_normal((10, 3)) X X.mean(axis=0)
預期輸出
array([ 0.15030588,  0.14030961, -0.34238602])

X 是 (10, 3),摺掉列之後剩三個數字,每一欄一個平均。

來源:Ch02-statlearn-lab-zh.ipynb
觀念釐清
X.mean(0) 與 X.mean(axis=0) 有差嗎?
沒有,第一個位置參數就是 axis。lab 裡兩種寫法都出現過,輸出完全一樣。寫 axis=0 比較好讀,尤其後面還要接 keepdims 的時候。
為什麼 np.var 預設除以 n?
NumPy 預設計算這批數字本身的變異數,分母使用 n。統計上要估母體變異數才需要 n−1。pandas 的 .var() 預設是 ddof=1,兩邊的預設值不同,同一份資料可能得到不同數字;比較前先核對設定。
PART 06 · 自我檢測

X.shape 是 (10, 3),X.sum(axis=1).shape 是什麼?

(A) (10,)
(B) (3,)
(C) (10, 1)
🔗 這在本站哪一章會用到 第 2 章算訓練 MSE 與測試 MSE,就是 ((y - yhat)**2).mean();偏差—變異分解的每一項都是沿某個 axis 的平均。→ 統計學習 · 評估擬合品質
PART 07 · 亂數與模擬

default_rng(種子):讓別人跑得出跟你一樣的結果 課程 Lab Ch2 · lab 範例

這門課後面每一章都要模擬:自助法重抽、交叉驗證切分、隨機森林抽變數。 只要用到亂數,就一定要固定種子,否則你今天的圖跟明天的圖不一樣, 跟同學的也不一樣,討論時就要先分辨差異是否來自抽樣。

現在的寫法是 default_rng np.random.normal(...) 用的是全域狀態,誰在哪裡呼叫都會動到它。新版建議自己開一個產生器:rng = np.random.default_rng(1303),之後都用 rng. 開頭。
圖表需要連網載入 Chart.js:固定種子時,兩次抽樣的直方圖會完全重合;不固定種子則每次都不同。
›先固定種子按兩次重抽,再取消固定按兩次。
模擬示意
按重抽看差別
打開「固定種子」再按幾次重抽,直方圖一動也不動;關掉之後每按一次就變一次。
這一次抽樣
樣本數 n50
樣本平均—
樣本標準差—
n 變大會怎樣
在這個獨立常態抽樣模型下,n 較大時平均的抽樣分布更集中;單次平均不保證更接近 0。大數法則與抽樣分布見 S3;自助法的有放回重抽機制見 S4。
沒固定種子:兩次結果不同
print(np.random.normal(scale=5, size=2)) print(np.random.normal(scale=5, size=2))
預期輸出
[9.78166034 7.77407713]
[-1.41427653 -4.97598078]

同一行跑兩次會得到不同數字,報告中要交代抽樣設定。

來源:Ch02-statlearn-lab-zh.ipynb
固定種子:兩個產生器給一模一樣的數
rng = np.random.default_rng(1303) print(rng.normal(scale=5, size=2)) rng2 = np.random.default_rng(1303) print(rng2.normal(scale=5, size=2))
預期輸出
[ 4.09482632 -1.07485605]
[ 4.09482632 -1.07485605]

default_rng(1303) 開兩次,抽出來逐位相同。本站每一張自己算的圖都是這樣產生的。

來源:Ch02-statlearn-lab-zh.ipynb
跨章應用:相關係數矩陣
相關係數矩陣
np.corrcoef(x, y)
預期輸出
array([[1.        , 0.78689588],
       [0.78689588, 1.        ]])

對角線一定是 1,非對角線是兩個變數的相關係數。第 3 章看共線性時會一直用到這個矩陣。

來源:Ch02-statlearn-lab-zh.ipynb
EXERCISES · 練習

動手驗證:概念自測 先備 · 自我檢測

回顧本頁觀念與原 Lab 的程式,確認各個操作的意義與使用條件。

EXERCISE 1 · 形狀推理

A 是 (4, 4)。A[1:4:2, 0:3:2].shape 是什麼?

(A) (2, 2)
(B) (2, 3)
(C) (3, 3)
EXERCISE 2 · 花式索引

A[[0,1,2],[0,1,2]] 拿到的是什麼?

(A) 對角線上的三個數字
(B) 左上角 3×3 的子矩陣
(C) 會報錯,兩個串列不能同時給
EXERCISE 4 · 檢視與複本

沿用本頁連續儲存的 A 矩陣,下列哪一個操作會複製一份資料?

(A) B = A[1:3]
(B) B = A[[1, 3]]
(C) B = A.reshape((2, 8))
重點速查與來源

NumPy 陣列速查表 先備 · NumPy 陣列

來源:完整書目與章節定位

本頁書目與章節定位

  • 教科書:An Introduction to Statistical Learning with Applications in Python。James、Witten、Hastie、Tibshirani、Taylor,2023。原書與下載資訊

需要核對完整公式、比較表或實作時,再展開下方速查。

查閱完整速查與延伸提醒

下面三張表整理索引、彙總方向與容易混淆的寫法,後續處理資料時可以回查。

你想做的事寫法回傳的是檢視還是複本
取連續的列A[1:3]檢視
取指定的幾列A[[1, 3]]複本
取指定的幾欄A[:, [0, 2]]複本
取子矩陣(交叉)A[np.ix_([1,3], [0,2])]複本
用條件挑列A[mask](mask 是布林陣列)複本
換形狀A.reshape((2, 3))可行時共用資料,否則複製
轉置A.T檢視
確定要獨立一份A.copy()複本
彙總axis=0axis=1不給 axis
(10, 3) 的輸入摺掉列 → (3,)摺掉欄 → (10,)全摺 → 純量
直覺說法每一欄一個數字每一列一個數字整塊一個數字
常見用途欄平均、欄標準差(標準化)每筆觀測的總和整體 MSE
容易搞混的一對差在哪
np.var(y) vs y.var()沒差,兩個都是除以 n
np.var(y) vs pandas 的 s.var()有差:NumPy 預設 ddof=0,pandas 預設 ddof=1
A[[0,1]] vs A[np.array([False,True])]整數索引挑「第 0、1 列」;布林索引挑「True 的那些列」
X.mean(1) vs X.mean(1, keepdims=True)前者 (10,) 廣播會對錯邊;後者 (10,1) 才對得回列
np.random.normal vs rng.normal前者動到全域狀態;後者是你自己的產生器,可重現
三個閱讀重點 1. shape 是 (列, 欄),列在前。看不懂錯誤訊息就先印 shape。
2. 基本切片給的是檢視;reshape 可行時共用資料,否則複製。花式索引與布林索引給的是複本。不確定就 .copy()。
3. axis 指的是被摺掉的那一維。axis=0 往下摺得到欄的統計量,axis=1 往右摺得到列的統計量。
CARDS · 關鍵詞彙卡

關鍵詞彙卡:點卡片翻面 課程詞彙

詞彙卡整理本頁引用的課程 lab中常用的統計或機器學習專有名詞,正面附英文名稱。 先看正面的術語,試著說出定義,再翻面核對。可以洗牌複習,也可以搭配本章例子練習解釋。

複習:展開關鍵詞彙卡