2014-12-04 2 views
3

Мой вопрос - это что-то похожее на вопрос here. Простым термином я имею данные углового ряда, ограниченного в [0, 360]. Мне нужно интерполировать значения между измерениями. В настоящее время я использую scipy.interpolate.interp1d. Для того, чтобы сделать мой вопрос еще яснее здесь пример сценария,Ограниченная круговая интерполяция в python

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

Под 'standard' вы имеете в виду часть дистрибутива Python или Numpy, SciPy? Вы проводили какое-либо время, просматривая документацию? – wwii

+0

Да, вы правы, я имею в виду что-нибудь в Numpy, SciPy (я не хочу иметь что-то, что можно использовать только для решения этой конкретной проблемы). Я попытался просмотреть документацию, но, как вы можете сказать, мои знания об интерполяции не более чем линейные – hashmuke

+0

Какое * направление * - угол меняется - * по часовой стрелке * или * против часовой стрелки *? Как это определяется? – wwii

ответ

3

Просто добавьте 360 ° дополнение каждый раз, когда вы обнаружите, что есть прыжок и вернитесь назад к первым 360 градусам, используя операцию modulo. Например:

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 ° между 2 последовательными пунктами, но вы знаете направление изменения углов (например, 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]) 
+0

np.unwrap сделает мне трюк спасибо – hashmuke

Смежные вопросы