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.pi
和 a[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)
我希望将弧度数组转换为范围 [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 thandiscont
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.pi
和 a[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)