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
,你就能在三维几何、相位分析、图像处理等多领域,高效地完成反余弦计算。欢迎在评论区分享你的实践案例和问题!