在Python numpy中,有一个unwrap函数:
通过将大于discont的绝对跳跃改变为沿给定轴的2*pi补码来展开弧度相位p.
现在,我想做相反的功能.如何包装一系列阶段?例如,如何将所有角度转换为约束它们在-π和π之间?
显而易见的方法是做一些事情:
for i, a in enumerate(phases):
while a < pi:
a += 2 * pi
while a > pi:
a -= 2 * pi
phases[i] = a
Run Code Online (Sandbox Code Playgroud)
但有更简单/更快的方式吗?
seg*_*sai 40
phases = (phases + np.pi) % (2 * np.pi) - np.pi
Run Code Online (Sandbox Code Playgroud)
u55*_*u55 10
import numpy as np
phases = np.arctan2(np.sin(phases), np.cos(phases))
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为sin(阶段)/ cos(阶段)= = tan(阶段).我们通过使用反正切函数得到相位(模2π).在数学上,反正切函数是多值的,因此在编程语言中,通常将其定义为以固定间隔返回相位.
双参数反正切函数,即np.arctan2(numerator, denominator)与常规反正切函数相同,只是它跟踪分子和分母的符号,因此能够返回模2π的相位,而不是np.arctan(numerator/denominator)仅仅是常规函数能够以模数π返回相位.Numpy的arctan2函数实现被定义为返回[-π,+π]范围内的相位,这是OP请求的范围.
附加说明:此arctan2方法直接来自复杂表示,完全在数学上等同于:
phases = np.angle(np.exp(1j*phases))
Run Code Online (Sandbox Code Playgroud)
这可能更直观.实际上,numpy的angle函数arctan2在幕后用来分离指数的虚部和实部,即正弦和余弦.
小智 5
此答案与 sega_sai 答案略有不同,即:
phases = ( phases + np.pi) % (2 * np.pi ) - np.pi
Run Code Online (Sandbox Code Playgroud)
这将阶段映射到 [-pi, pi) -> 这意味着 pi 被映射到 -pi
显示在这里:
In [27]: phases = np.pi
In [28]: phases = ( phases + np.pi) % (2 * np.pi ) - np.pi
In [29]: print phases
-3.14159265359
Run Code Online (Sandbox Code Playgroud)
这是完全合法的,但如果你想要一个 (-pi, pi] 的映射,那么
将操作的输入和输出乘以购买 -1。像这样:
phases = (( -phases + np.pi) % (2.0 * np.pi ) - np.pi) * -1.0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15705 次 |
| 最近记录: |