我希望将弧度数组转换为范围 [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])
这是怎么回事?
最佳答案
虽然接受的答案给了你想要的结果,但我认为它没有触及问题的核心,如果我正确地解释了你的问题,那么你实际上想要 wrap 你的阶段,而不是展开它。
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)
关于Python numpy 解包函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44664116/