Python numpy unwrap函数

Sun*_*ner 4 python pi numpy python-2.7

我希望将一个弧度数组转换为范围,[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)
Run Code Online (Sandbox Code Playgroud)

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

array([ 3.14159265,  6.28318531,  9.42477796])
Run Code Online (Sandbox Code Playgroud)

它没有打开包装.但是,如果我在不使用的情况下运行以下命令numpy.pi

a = np.array([3.14159265,  6.28318531,  9.42477796])
np.unwrap(a)
Run Code Online (Sandbox Code Playgroud)

输出是正确的:

array([  3.14159265e+00,   2.82041412e-09,   3.14159265e+00])
Run Code Online (Sandbox Code Playgroud)

到底是怎么回事?

BZ1*_*BZ1 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)
Run Code Online (Sandbox Code Playgroud)

当然,由于采样错误,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)
Run Code Online (Sandbox Code Playgroud)