我的问题类似于问题here。简单来说,我有一个以[0,360]为界的时间序列角度数据。我需要在测量之间插值。目前,我正在使用scipy.interpolate.interp1d。为了使我的问题更加清晰,这是一个示例场景,
import numpy as np
from scipy import interpolate
data = np.array([[0, 2, 4], [1, 359, 1]])
f = interpolate.interp1d(data[0, :], data[1, :], kind='linear', bounds_error=False, fill_value=None)
f([1, 3])
这将导致[180.,180。]。然而,在时间2和时间4之间,角度从359变为1,即仅2度变化,3处的插值应为0.角度在CCW方向上随时间变化。
最后,我的问题是这个,
我可以使用任何标准模块来实现这一目标吗?
仅仅因为我想尽可能避免使用自定义方法!
答案 0 :(得分:6)
每次检测到跳跃时,只需添加360°补码,然后使用模运算恢复到前360度。例如:
In [1]: import numpy as np
In [2]: from scipy import interpolate
In [3]: data = np.array([[0, 2, 4, 6, 8], [1, 179, 211, 359, 1]])
In [4]: complement360 = np.rad2deg(np.unwrap(np.deg2rad(data[1])))
In [5]: complement360
Out[5]: array([ 1., 179., 211., 359., 361.])
In [6]: f = interpolate.interp1d(data[0], complement360, kind='linear', bounds_error=False, fill_value=None)
In [7]: f(np.arange(9))
Out[7]: array([ 1., 90., 179., 195., 211., 285., 359., 360., 361.])
In [8]: f(np.arange(9))%360
Out[8]: array([ 1., 90., 179., 195., 211., 285., 359., 0., 1.])
备注,我确实在这里添加了一些额外的值,否则np.unwrap
无法知道角度增加的方向,这可能也就是你知道它在增加的方式方式(连续值之间的差异小于180°,除非存在实际的不连续性)。
但是,如果您确实有数据使两个连续项之间的角度跳跃大于180°,但是您知道角度变化的方向(例如CCW)并且它正在单调变化,那么您可以检测到它这样:
In [31]: data = np.array([1, 359, 1, 60, 359, 177, 2]) # mock-data
In [32]: jumps = np.diff(data)<0 # assumptions: angle increases stricly monotonously CCW
In [33]: np.hstack((data[0], data[1:] + np.cumsum(np.sign(d)<0)*360))
Out[33]: array([ 1, 359, 361, 420, 719, 897, 1082])
答案 1 :(得分:2)
从版本1.10.0开始,numpy.interp采用句点关键字:http://docs.scipy.org/doc/numpy/reference/generated/numpy.interp.html