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