Python numpy unwrap函数

时间:2017-06-20 22:41:15

标签: python python-2.7 numpy pi

我希望将弧度数组转换为范围[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])

发生了什么事?

3 个答案:

答案 0 :(得分:5)

虽然接受的答案会为您提供您想要的结果,但我不认为它会解决问题的核心,如果我正确地解释您的问题,那么您实际上是想要包装你的阶段,而不是解开它。

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就是您想要的。我能想到的最简单的方法是使用模运算符:

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)不会返回您的原始a,因此可能不清楚这是否相反。但是,如果您改进了抽样,它确实会返回原来的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)

答案 1 :(得分:3)

取自np.unwrap docs:

  

通过更改大于的绝对跳跃来展开弧度阶段p   discont沿给定轴的2 * pi补充。

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,因此不会被解开'。但是,如果

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

a[1] - a[0] = 3.1415926600000001大于np.pi,因此该函数会展开值。

答案 2 :(得分:1)

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

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