我希望将弧度数组转换为范围[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])
发生了什么事?
答案 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.pi
和a[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