python | numpy小記(五):理解 NumPy 中的 `np.arccos`:反余弦函數
- 一、函數簽名與核心參數
- 二、數學定義與取值范圍
- 三、基礎使用示例
- 四、與 Python 內建 `math.acos` 的對比
- 五、常見問題與注意事項
- 六、典型應用場景
- 1. 三維向量夾角計算
- 2. 信號處理與相位差
- 3. 幾何繪圖
- 七、小結
在科學計算與信號處理等領域,經常需要根據已知余弦值反向求角度——這時就用到 NumPy 提供的 np.arccos
(反余弦)函數。下面從函數簽名、數學定義、使用示例、注意事項和典型應用等方面,幫你系統地理解并掌握 np.arccos
。
一、函數簽名與核心參數
numpy.arccos(x, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True)
x
:輸入標量或數組(array_like
),其元素應在 [ ? 1 , 1 ] [-1,1] [?1,1] 范圍內。out
:可選,提供一個同形狀的數組用來就地存放結果。- 其余參數用于高級廣播、類型轉換和性能調優,一般無需修改。
返回值是一個與 x
同形狀的 ndarray
,元素值就是對應輸入的反余弦角度(單位:弧度)。
二、數學定義與取值范圍
-
定義
arccos ? ( x ) = θ , s.t. cos ? ( θ ) = x , 0 ≤ θ ≤ π . \arccos(x) = \theta, \quad \text{s.t.}\;\cos(\theta)=x,\;0\le\theta\le\pi. arccos(x)=θ,s.t.cos(θ)=x,0≤θ≤π.
-
定義域:輸入 x x x 必須在 [ ? 1 , 1 ] [-1,1] [?1,1] 之內,否則輸出
nan
并伴隨警告。 -
值域:返回角度 θ ∈ [ 0 , π ] \theta\in[0,\pi] θ∈[0,π],即 [ 0 , 18 0 ° ] [0,180^\circ] [0,180°]。
三、基礎使用示例
import numpy as np# 標量運算
print(np.arccos(1.0)) # 0.0 (0°)
print(np.arccos(0.0)) # ≈1.5708 (90°)
print(np.arccos(-1.0)) # ≈3.1416 (180°)# 數組運算
arr = np.array([1.0, 0.5, 0.0, -0.5, -1.0])
res = np.arccos(arr)
print(res)
# [0. 1.04719755 1.57079633 2.0943951 3.14159265]
# 其中 1.04719755≈60°,2.0943951≈120°
四、與 Python 內建 math.acos
的對比
math.acos(x) | np.arccos(x) | |
---|---|---|
支持類型 | 單個浮點數 | 標量或任意維度數組 |
返回類型 | Python float | NumPy ndarray |
性能 | 單次調用 | 向量化批量運算,性能更高 |
廣播與 out | 不支持 | 支持廣播、就地存儲(out ) |
五、常見問題與注意事項
-
超出 [ ? 1 , 1 ] [-1,1] [?1,1]
x = np.array([1.2, -1.5]) theta = np.arccos(x) # 會得到 [nan, nan] 并出現 RuntimeWarning
可先用
np.clip(x, -1, 1)
將數值截斷再計算,避免nan
。 -
數據類型
- 輸入整數數組會被自動轉換為浮點運算。
- 輸出默認
float64
,可用out=
或在后續處理中轉換類型。
-
單位轉換
如果需要度為單位,可再乘以180/np.pi
:deg = np.arccos(arr) * 180 / np.pi
六、典型應用場景
1. 三維向量夾角計算
import numpy as npu = np.array([1, 0, 0])
v = np.array([1, 1, 0]) / np.sqrt(2)
dot = np.dot(u, v) # 0.707...
angle = np.arccos(dot) # ≈0.785 rad (45°)
print(angle, angle*180/np.pi)
2. 信號處理與相位差
對于頻域信號 X ( f ) X(f) X(f) 的實部和虛部,可計算相位:
phase = np.arccos(real_part / np.abs(X))
3. 幾何繪圖
結合 matplotlib
或 mayavi
,可繪制極坐標或 3D 曲面:
import numpy as np
import matplotlib.pyplot as plttheta = np.linspace(0, np.pi, 100)
y = np.cos(theta)
plt.plot(theta, y)
plt.xlabel('θ (rad)')
plt.ylabel('cos θ')
plt.title('Cosine Curve and Inverse Cosine Points')
plt.scatter(np.arccos(y), y)
plt.show()
七、小結
- 功能:批量對輸入數組執行反余弦運算,輸出弧度制角度。
- 優勢:向量化、支持廣播與就地寫入;性能遠勝逐元素 Python 循環。
- 注意:保持輸入 [ ? 1 , 1 ] [-1,1] [?1,1] 范圍,避免產生
nan
,并留意返回類型。
掌握 np.arccos
,你就能在三維幾何、相位分析、圖像處理等多領域,高效地完成反余弦計算。歡迎在評論區分享你的實踐案例和問題!