np.dot(v1, v2) 結果是多少?NumPy 向量矩陣運算識別
依據附圖程式碼進行資料處理,下列何者正確?import numpy as np
v1 = np.array([1, 2, 3])
v2 = np.array([4, 5, 6])
A = np.array([[1, 2], [3, 4]])
程式碼定義了兩個向量 v1=[1,2,3]、v2=[4,5,6],和一個 2×2 矩陣 A=[[1,2],[3,4]]。題目問這四個操作哪一個描述正確:linalg.inv 算什麼、v1 * v2 是什麼、np.dot(v1,v2) 的結果、linalg.eig 算什麼。
問你:哪一個描述正確說出了該 NumPy 函數的功能或計算結果?
一句話總結
np.dot(v1, v2) 計算兩個向量的內積:1×4 + 2×5 + 3×6 = 4 + 10 + 18 = 32,返回純量 np.int64(32),這是選項 C 正確描述的結果。
先感受問題:四個 NumPy 函數,哪個描述配哪個?
「資料創智」的初級工程師陳亦宏在學 NumPy,遇到了一批考題。他需要把四個 NumPy 函數的名稱和它們的功能配對起來:
v1 * v2 → 是元素相乘還是內積?
np.dot(v1, v2) → 算什麼?結果是多少?
np.linalg.eig(A) → 算什麼?
這四個函數在 ML 裡都很常見:線性代數(矩陣反矩陣、特徵值)和向量運算(點積)是神經網路、PCA、線性迴歸的數學基礎。
選項 C 說 np.dot(v1, v2) = np.int64(32),需要確認這個計算是否正確。
四個 NumPy 操作各自做什麼?
- np.linalg.inv(A):計算矩陣 A 的「反矩陣(Inverse Matrix)」,不是行列式。滿足 A × inv(A) = 單位矩陣 I。行列式要用 np.linalg.det(A) 計算。inv 和 det 是完全不同的東西:inv 返回一個矩陣,det 返回一個純量。
- v1 * v2(星號乘法):在 NumPy 中,* 對陣列做「元素對元素(element-wise)」的乘法,結果是 [1×4, 2×5, 3×6] = [4, 10, 18],不是 [5, 7, 9]。[5, 7, 9] 是加法(v1 + v2)的結果,不是乘法。
- np.dot(v1, v2):計算「內積(Dot Product)」,是對應元素相乘後加總:1×4 + 2×5 + 3×6 = 4 + 10 + 18 = 32。返回一個純量(不是陣列),資料型別是 np.int64。
- np.linalg.eig(A):計算矩陣 A 的「特徵值和特徵向量(Eigenvalues and Eigenvectors)」,不是反矩陣。返回 (eigenvalues, eigenvectors),是 PCA 和主成分分析的核心計算。
- 混淆 inv / det / eig 的根本原因:三個函數都在 np.linalg 子模組下,縮寫接近(inv、det、eig),考試容易把功能互換。記法:inv = inverse(反矩陣,矩陣輸出);det = determinant(行列式,純量輸出);eig = eigenvectors(特徵值向量,tuple 輸出)。
驗算 np.dot(v1, v2) = 32
陳亦宏逐步計算 np.dot(v1, v2):
v2 = [4, 5, 6]
np.dot(v1, v2) = v1[0]×v2[0] + v1[1]×v2[1] + v1[2]×v2[2]
= 1×4 + 2×5 + 3×6
= 4 + 10 + 18
= 32
返回類型:np.int64(32)(因為 v1 和 v2 的元素都是整數,點積也是整數)
選項 C 完整且正確地描述了 np.dot 的計算結果。
這就是選項 C 講的:np.dot(v1, v2) 結果為 np.int64(32)。
技術版:NumPy 核心線性代數函數總覽與向量運算規則
中級考試大概率會考程式碼跟公式,所以這部分你還是要學。但如果現在學起來很痛苦,可以先跳過,等讀完其他題目回頭再來。
想像向量是「有方向的箭頭」。v1 = [1,2,3] 是一個在 3D 空間中的箭頭,v2 = [4,5,6] 是另一個。np.dot(v1, v2) = 32 代表這兩個箭頭「指向相似方向的程度」(投影)。如果兩個向量垂直,點積 = 0;同向時點積最大。這個操作是餘弦相似度計算的基礎,也是神經網路每一層加權計算的核心數學。
| 函數 | 功能 | 本題結果 |
|---|---|---|
| v1 * v2 | 元素對元素乘法 | array([4, 10, 18]) |
| v1 + v2 | 元素對元素加法 | array([5, 7, 9]) |
| np.dot(v1, v2) | 向量內積(點積) | np.int64(32) |
| np.linalg.inv(A) | 反矩陣 | array([[-2., 1.], [1.5, -0.5]]) |
| np.linalg.det(A) | 行列式 | -2.0 |
| np.linalg.eig(A) | 特徵值和特徵向量 | (array([-0.37, 5.37]), vectors) |
- Dot Product(內積)
- 兩個向量對應元素相乘後加總,結果是純量,公式:v1·v2 = Σ v1[i] × v2[i]
- Element-wise(元素對元素)
- 對兩個陣列對應位置的元素各自做操作,結果仍是陣列
- Inverse Matrix(反矩陣)
- 滿足 A × A⁻¹ = I 的矩陣,np.linalg.inv 計算
- Determinant(行列式)
- 方陣的一個純量,np.linalg.det 計算,反矩陣存在的條件是行列式不為 0
- Eigenvalue(特徵值)
- 滿足 Av = λv 的純量 λ,np.linalg.eig 計算
v1 = [1, 2, 3], v2 = [4, 5, 6] v1 * v2 (element-wise): [1×4, 2×5, 3×6] = [4, 10, 18] ← 不是 [5,7,9] np.dot(v1, v2) (dot product): 1×4 + 2×5 + 3×6 = 4 + 10 + 18 = 32 ← 正確 A = [[1, 2], [3, 4]] np.linalg.det(A): 1×4 - 2×3 = 4 - 6 = -2.0 np.linalg.inv(A): (1/det) × [[4, -2], [-3, 1]] = (1/-2) × [[4, -2], [-3, 1]] = [[-2, 1], [1.5, -0.5]] ← 不是行列式 np.linalg.eig(A): 特徵值 λ 滿足 det(A - λI) = 0 (1-λ)(4-λ) - 6 = 0 λ² - 5λ - 2 = 0 λ ≈ -0.37 或 5.37 ← 特徵值,不是反矩陣
- np.dot(v1, v2) 和 v1 * v2 的差別是什麼?各返回什麼類型?
- np.linalg.inv(A) 和 np.linalg.det(A) 各返回什麼?兩者的關係是什麼?
- 如果矩陣 A 的行列式為 0,np.linalg.inv(A) 會發生什麼?
- np.linalg.eig(A) 返回什麼?如何提取特徵值和特徵向量?
- 兩個向量的點積等於 0 代表什麼幾何意義?
為什麼其他選項是錯的
字面在說什麼:np.linalg.inv(A) 計算矩陣 A 的行列式。
為什麼不對:inv 是 inverse(反矩陣),不是 determinant(行列式)。計算行列式要用 np.linalg.det(A)。反矩陣返回一個和 A 同形狀的矩陣(本題是 2×2),行列式返回一個純量。兩者是完全不同的線性代數操作,雖然都和「可逆性」有關(行列式不為 0 才有反矩陣),但計算方法和結果形式完全不同。
誰會選錯:把 inv(反矩陣)和 determinant(行列式)的名稱混淆,或記不住各函數縮寫含義的人。
字面在說什麼:v1 和 v2 用星號相乘的結果是 [5, 7, 9]。
為什麼不對:[5, 7, 9] 是 v1 + v2 的結果(1+4=5, 2+5=7, 3+6=9),不是 v1 * v2。v1 * v2 在 NumPy 中是 element-wise 乘法:[1×4, 2×5, 3×6] = [4, 10, 18]。這是「加法和乘法」的基礎混淆,是考試中最常見的計算失誤。
誰會選錯:不熟悉 NumPy 的 element-wise 乘法語義,直覺上把 * 操作的結果當加法算的人。
字面在說什麼:np.linalg.eig(A) 計算矩陣 A 的反矩陣。
為什麼不對:eig 是 eigenvector/eigenvalue(特徵值/特徵向量),不是 inverse(反矩陣)。np.linalg.eig(A) 返回一個包含兩個元素的 tuple:(特徵值陣列, 特徵向量矩陣)。反矩陣要用 np.linalg.inv(A)。eig 和 inv 的縮寫非常不同,但考試中容易因為「都在 linalg 下」而混淆。
誰會選錯:沒有記住 NumPy linalg 子模組各函數縮寫含義,在 inv、det、eig 三個函數之間混淆的人。
同個考點下次怎麼變形
直覺:如果 v1 和 v2 都是浮點數,np.dot(v1, v2) 的返回類型會改變嗎?
答案:會改變。v1 = np.array([1.0, 2.0, 3.0]),v2 = np.array([4.0, 5.0, 6.0]),np.dot(v1, v2) = np.float64(32.0)。NumPy 根據輸入的資料型別決定輸出類型,整數輸入 → int64,浮點數輸入 → float64。考試有時會考類型敏感的題目,要注意。
直覺:np.dot(A, v1) 當 A 是 2×2 矩陣、v1 是長度 3 的向量,會發生什麼?
答案:會報錯(ValueError: shapes (2,2) and (3,) not aligned)。矩陣-向量乘法要求矩陣的列數等於向量的長度:A(m×n) × v(n) = result(m)。A 是 2×2,v1 是長度 3,維度不匹配。本題的 v1、v2 都是長度 3,所以點積可以計算;A 是 2×2,若要和向量相乘需要長度 2 的向量。
直覺:np.dot 用在兩個矩陣上(矩陣乘法)和用在兩個向量上(點積),有什麼差異?
答案:np.dot(v1, v2) 對兩個一維向量計算內積,返回純量。np.dot(A, B) 對兩個二維矩陣計算矩陣乘法,返回矩陣,要求 A 的列數等於 B 的行數。Python 3.5 之後可用 @ 運算符做矩陣乘法(A @ B),更清楚。np.dot 和 @ 在矩陣乘法上結果相同,但 np.dot 在多維陣列的行為較複雜,現代 NumPy 程式碼偏好用 @。
直覺:np.dot(v1, v2) = 32 在機器學習中有什麼實際意義?
答案:點積是多個 ML 操作的基礎:(1)神經網路的全連接層:每個神經元的輸出 = np.dot(weights, input) + bias;(2)餘弦相似度:cos(θ) = dot(v1, v2) / (||v1|| × ||v2||),本題 dot=32,||v1||=√14,||v2||=√77,相似度約 0.974;(3)線性迴歸:預測值 = np.dot(X, w) + b;(4)注意力機制:Query × Key 的點積。
直覺:np.linalg.inv(A) 在 ML 中什麼時候會用到?
答案:線性迴歸的解析解:w = (XᵀX)⁻¹ × Xᵀy,直接用反矩陣求最優權重(不需要梯度下降)。這在資料量小的時候很有效,但 XᵀX 是 p×p 的矩陣(p 是特徵數),計算反矩陣的複雜度是 O(p³),特徵數很多時就很慢,這是大型 ML 問題通常改用梯度下降的原因。
想再往下看,這 5 個
- 餘弦相似度(Cosine Similarity)np.dot(v1, v2) 是計算餘弦相似度的基礎步驟,是 NLP 和推薦系統中最常用的向量相似度度量。
- 主成分分析(PCA)np.linalg.eig 是 PCA 的核心計算:對協方差矩陣做特徵值分解,找出最大變異量方向。
- 特徵值(Eigenvalue)np.linalg.eig 計算的輸出,代表每個主成分方向能解釋的變異量大小,PCA 降維的決策依據。
- 矩陣分解(Matrix Factorization)推薦系統和降維的重要技術,依賴 NumPy 的矩陣運算(linalg.svd 等),是 np.dot 矩陣乘法的擴展應用。
- 神經網路(Neural Network)每一層的前向傳播本質是矩陣-向量乘法(np.dot 或 @),是 NumPy 線性代數操作在 ML 中最直接的應用。