2016-04-04 6 views
4

Я ищу способ сделать простую линейную интерполяцию между двумя массивами numpy, которые представляют собой начало и конечную точку во времени.numpy: как интерполировать между двумя массивами для разных временных меток?

два массива имеют одинаковую длину:

fst = np.random.random_integers(5, size=(10.)) 
>>> array([4, 4, 1, 3, 1, 4, 3, 2, 5, 2]) 
snd = np.random.random_integers(5, size=(10.)) 
>>> array([1, 1, 3, 4, 1, 5, 5, 5, 4, 3]) 

между моим началом и концом есть 3 временных шагов. Как я могу интерполировать между fst и snd? Я хочу, чтобы иметь возможность, сделав первый ввод fst и snd в качестве примера, чтобы получить значение каждого временного шага, как

np.interp(1, [1,5], [4,1])  
np.interp(2, [1,5], [4,1]) 
... 
# that is 
np.interp([1,2,3,4,5], [1,5], [4,1]) 
>>> array([ 4. , 3.25, 2.5 , 1.75, 1. ]) 

Но чем не только для первой записи, но на протяжении всего массива.

Очевидно, что это не будет делать это:

np.interp(1, [1,5], [fst,snd]) 

Ну я знаю, что я получаю там в цикле, например,

[np.interp(2, [1,5], [item,snd[idx]]) for idx,item in enumerate(fst)] 
>>> [3.25, 3.25, 1.5, 3.25, 1.0, 4.25, 3.5, 2.75, 4.75, 2.25] 

но я верю, что когда вы перебираете многочисленные массивы, вы делаете что-то принципиально неправильно.

ответ

1

Объекты в scipy.interpolate.interp1d позволяют сделать это довольно легко, если вы сформируете образцы в 2D-матрицу. В вашем случае, вы можете создать массив 2XN, и построить функцию интерполяции, которая работает вниз столбцы:

from scipy.interpolate import interp1d 
fst = np.array([4, 4, 1, 3, 1, 4, 3, 2, 5, 2]) 
snd = np.array([1, 1, 3, 4, 1, 5, 5, 5, 4, 3]) 
linfit = interp1d([1,5], np.vstack([fst, snd]), axis=0) 

Вы можете генерировать интерполированный вектор в любое время интереса. Например linfit(2) производит:

array([ 3.25, 3.25, 1.5 , 3.25, 1. , 4.25, 3.5 , 2.75, 4.75, 2.25]) 

или вы можете вызвать linfit() с вектором значений времени, например linfit([1,2,3]) дает:

array([[ 4. , 4. , 1. , 3. , 1. , 4. , 3. , 2. , 5. , 2. ], 
     [ 3.25, 3.25, 1.5 , 3.25, 1. , 4.25, 3.5 , 2.75, 4.75,   2.25], 
     [ 2.5 , 2.5 , 2. , 3.5 , 1. , 4.5 , 4. , 3.5 , 4.5 , 2.5 ]]) 

Если вы только делаете линейной интерполяции, вы можете просто сделать что-то вроде:

((5-t)/(5-1)) * fst + ((t-1)/(5-1)) * snd 

непосредственно вычислить интерполированное вектор в любое время т.

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