has*_*uke 7 python interpolation numpy scipy
我的问题类似于这里的问题.简单来说,我有一个以[0,360]为界的时间序列角度数据.我需要在测量之间插值.目前,我正在使用scipy.interpolate.interp1d.为了使我的问题更加清晰,这是一个示例场景,
import numpy as np
from scipy import interpolate
data = np.array([[0, 2, 4], [1, 359, 1]]) # first row time index, second row angle measurements
f = interpolate.interp1d(data[0, :], data[1, :], kind='linear', bounds_error=False, fill_value=None)
f([1, 3])
Run Code Online (Sandbox Code Playgroud)
这将导致[180,180.].然而,在时间2和时间4之间,角度从359变为1,即仅2度变化,3处的内插值应为0.角度在CCW方向上随时间变化.
最后,我的问题是,
我可以使用任何标准模块来实现这一目标吗?
只是因为我想尽可能避免自定义方法!
每次检测到跳跃时,只需添加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.])
Run Code Online (Sandbox Code Playgroud)
备注,我确实在这里添加了一些额外的值,否则没有现实的方法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])
Run Code Online (Sandbox Code Playgroud)