HOWTO · Python

在 Python 中计算反余弦

我们可以使用 acos() 函数和 NumPy 库在 Python 中计算反余弦

本页内容

反余弦(也称 arccos)用于求出余弦值为给定数值时对应的主值角。它是余弦函数的反函数,而不是余弦的倒数(1 / cos(x))。在 Python 中,单个数值可使用 math.acos(),数组计算可使用 numpy.arccos()。这两个函数返回的角度单位都是弧度。

使用 math.acos() 计算单个值

标准库函数 math.acos() 接受一个介于 -1 和 1 之间(包括两端)的实数。例如,余弦值 0.5 对应的角度是 π/3 弧度,也就是 60 度。

运行以下示例:

本节中的代码以及显示的标签或输出仍为英文。

import math

cosine_value = 0.5
angle_radians = math.acos(cosine_value)
print(angle_radians)
1.0471975511965979

此示例会输出弧度值。返回结果约为 1.0472,即 π/3。反余弦的主值范围是 0 到 π 弧度。

将结果从弧度转换为角度

使用 math.degrees() 转换结果;degrees() 是 math 模块中的函数,并非独立的内置函数。格式化设置决定显示的小数位数,底层浮点数仍保留其通常的精度。

本节中的代码以及显示的标签或输出仍为英文。

import math

cosine_value = 0.5
angle_radians = math.acos(cosine_value)
angle_degrees = math.degrees(angle_radians)
print(f"{angle_degrees:.1f} degrees")
60.0 degrees

此示例将角度显示到小数点后一位。结果中的单位标签 degrees 保持英文。调整 .1f 中的数字,即可设置格式化文本显示的小数位数。

使用 numpy.arccos() 处理数组

NumPy 是第三方软件包,因此运行此示例前,需要先在当前环境中安装它。NumPy 的 arccos 运算会逐个元素处理数组;当输入已经整理为 NumPy 数据时,这种方式很实用。

本节中的代码以及显示的标签或输出仍为英文。

import numpy as np

cosine_values = np.array([0.5, 1.0, -1.0])
angles_radians = np.arccos(cosine_values)
print(angles_radians)
[1.04719755 0.         3.14159265]

结果中的每个输入值都对应一个以弧度表示的角度,依次约为 π/3、0 和 π。NumPy 也能计算单个值的反余弦,但如果只需计算一个标量,使用 math.acos() 会更简单。

输入范围,以及如何选择 math.acos() 或 numpy.arccos()

对于实数反余弦,每个输入值都必须在 -1 到 1 之间(包括两端)。超出此范围的值没有实数反余弦结果。输入越界时,math.acos() 会引发 ValueError。在 NumPy 的常规错误设置下,numpy.arccos() 会对越界元素返回 nan,并发出运行时警告。只有当检查或截断计算出的余弦值符合计算本身的含义时,才应这样处理;截断可能会掩盖上游错误。如果数值来自归一化向量的点积,浮点舍入可能会使结果略微超出该范围。只有确定偏差来自舍入误差时才截断;否则应检查计算过程。对于数组,使用结果前应先检查哪些元素越界。

单个标量适合使用 math.acos(),数组或向量化计算则适合使用 numpy.arccos()。NumPy 不属于 Python 标准库;这里选择它的主要理由是其面向数组的接口。实际性能取决于工作负载,不能保证它对所有输入规模都更快。