Python numpy 解包函数

Python numpy unwrap function

我希望将弧度数组转换为范围 [0, 2*pi) 并且 numpy unwrap 函数正是我所需要的

但是,当我运行下面的代码输入a = [pi, 2*pi, 3*pi]时:

import numpy as np

a = np.array([np.pi, 2*np.pi, 3*np.pi])
np.unwrap(a)

我希望结果接近 [pi, 0, pi]。但是,输出仍然是:

array([ 3.14159265,  6.28318531,  9.42477796])

它没有展开。但是,如果我改为 运行 以下而不使用 numpy.pi

a = np.array([3.14159265,  6.28318531,  9.42477796])
np.unwrap(a)

输出正确:

array([  3.14159265e+00,   2.82041412e-09,   3.14159265e+00])

这是怎么回事?

似乎有一个舍入问题。两个测试用例不一样

a = np.array([np.pi, 2*np.pi, 3*np.pi])
a1 = np.array([3.14159265,  6.28318531,  9.42477796])
print('a ', ', '.join([str(i) for i in a]))
print('a1', ', '.join([str(i) for i in a1]))

a  3.14159265359, 6.28318530718, 9.42477796077   
a1 3.14159265, 6.28318531, 9.42477796

摘自 np.unwrap 文档:

Unwrap radian phase p by changing absolute jumps greater than discont to their 2*pi complement along the given axis.

其中 discont = np.pi(默认)。当

a = np.array([np.pi, 2*np.pi, 3*np.pi])

跳转 a[1] - a[0] = np.pia[2] - a[1] = np.pi 不大于 np.pi,因此不大于 'unwraped'。但是,如果

a = np.array([3.14159265,  6.28318531,  9.42477796])

您的 a[1] - a[0] = 3.1415926600000001 大于 np.pi,因此该函数解包值。

虽然接受的答案给了你想要的结果,但我认为它没有触及问题的核心,如果我正确解释你的问题,那是你真正想要的 wrap 你的相位,而不是 unwrap 它。

np.unwrap 在这种情况下工作的原因,对您的数据进行了微小的更改,实际上是 np.unwrap 计算结果的天真方式的结果;它只是查找数据中的局部不连续性并相应地进行调整。以这种方式获得您要查找的结果是抽样错误的结果。换句话说,如果您通过插值来改进采样以获得 a = np.array([np.pi, 3*np.pi/2, 2*np.pi, 5*np.pi/2, 3*np.pi]),则调整数据将不再起作用。

一种更复杂的相位展开方法,例如傅立叶变换方法,即使采样很差,也会让您的数据展开。

如果您真的想将数据限制为 [0, 2*pi)np.unwrap 就是您想要的 inverse。我能想到的结束阶段的最简单方法是使用模运算符:

import numpy as np

a = np.array([np.pi, 2 * np.pi, 3 * np.pi])
a_wrapped = a % (2 * np.pi)
print (a_wrapped)

当然因为抽样误差,np.unwrap(a_wrapped)并没有return你原来的a,所以可能不太清楚这是反的。但是,如果您改进抽样,它确实 return 原来的 a:

import numpy as np

a = np.arange(0, 4 * np.pi, np.pi/10)
print (a)
a_wrapped = a % (2 * np.pi)
print (a_wrapped)
a = np.unwrap(a_wrapped)
print (a)