numpy.unwrap对面

时间:2013-04-10 13:49:49

标签: python numpy

在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

但是有更简单/更快的方法吗?

3 个答案:

答案 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