python中的有界圆插值

时间:2014-12-04 13:39:35

标签: python numpy scipy interpolation

我的问题类似于问题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方向上随时间变化。

最后,我的问题是这个,

我可以使用任何标准模块来实现这一目标吗?

仅仅因为我想尽可能避免使用自定义方法!

2 个答案:

答案 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