我有一系列未包装的阶段,有一些解缠错误,包括+/-倍数Pi的跳跃:
import numpy
a = numpy.array([0.5, 1.3, 2.4, 10.3, 10.8, 10.2, 7.6, 3.2, 2.9])
在这个例子中,在2.4和10.3之间有2个循环的第一次跳跃,在7.6和3.2之间跳跃-1循环。我想删除跳转。问题是当你移除一个跳跃时,你需要相应地增加或减少系列的其余部分,而不仅仅是跳跃发生的值。
这样做是否更清洁(没有/更少循环,更快):
jumpsexist = 1
while jumpsexist:
# Look for absolute differences greater than Pi
jump = numpy.abs((numpy.roll(a,-1) -a)) > numpy.pi
if jump[:-1].any():
# Find the index of the first jump
jumpind = numpy.argmax(jump) + 1
# Calculate the number of cycles in that jump
cycles = ((a[jumpind] - a[jumpind- 1]) / numpy.pi).astype("Int8")
# Remove the cycles
a[jumpind:] -= cycles * numpy.pi
else:
break
答案 0 :(得分:8)
NumPy为相位展开提供函数numpy.unwrap()
。使用默认参数值,它将校正以2π为模的相位数组,使所有跳跃小于或等于π:
>>> a = numpy.array([0.5, 1.3, 2.4, 10.3, 10.8, 10.2, 7.6, 3.2, 2.9])
>>> numpy.unwrap(a)
array([ 0.5 , 1.3 , 2.4 , 4.01681469, 4.51681469,
3.91681469, 1.31681469, 3.2 , 2.9 ])
答案 1 :(得分:2)
这个怎么样:
import numpy as np
a = np.array([0.5, 1.3, 2.4, 10.3, 10.8, 10.2, 7.6, 3.2, 2.9])
d = np.diff(a)/np.pi
b = np.empty_like(a)
b[0] = a[0]
b[1:] = a[1:]-(np.floor(np.abs(d))*np.sign(d)).cumsum()*np.pi
给出:
In [40]: print a
[ 0.5 1.3 2.4 10.3 10.8 10.2 7.6 3.2 2.9]
In [41]: print b
[ 0.5 1.3 2.4 4.01681469 4.51681469 3.91681469
1.31681469 0.05840735 -0.24159265]
这里d
持有“跳跃”的签名杂志,并且适当截断的“跳跃”的累积总和是需要被删除/添加到该系列的每个成功元素的pi的多个部分。 / p>
这是你的意思吗?