2016-04-04 7 views
4

Ich bin auf der Suche nach einer einfachen linearen Interpolation zwischen zwei numpy Arrays, die einen Start und einen Endpunkt in der Zeit darstellen.numpy: Wie interpoliert man zwischen zwei Arrays für verschiedene Zeitschritte?

Die beiden Arrays die gleiche Länge:

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]) 

Zwischen meinem Start- und Endpunkt gibt es 3 Zeitschritte. Wie kann ich zwischen und snd interpolieren? Ich möchte in der Lage sein, den ersten Eintrag von fst und snd als Beispiel genommen wird, den Wert jeder Zeitschritt wie

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. ]) 

aber als nicht nur für den ersten Eintrag abzurufen, sondern über das gesamte Array.

Offensichtlich ist dies wird es nicht tun:

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

Nun, ich weiß, dass ich bekommen es in einer Schleife, z.B.

[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] 

Aber ich glaube, wenn Sie über numpy Arrays stolpern, tun Sie etwas grundlegend falsch.

Antwort

1

Die Einrichtungen in scipy.interpolate.interp1d ermöglichen dies sehr einfach, wenn Sie Ihre Proben in eine 2D-Matrix bilden. In Ihrem Fall können Sie einen 2 × N-Array, konstruieren und eine Interpolationsfunktion konstruieren, die die Spalten arbeiten nach unten:

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) 

können Sie dann einen interpolierten Vektor jederzeit von Interesse erzeugen. Zum Beispiel linfit(2) produziert:

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

oder können Sie linfit() mit einem Vektor von Zeitwerten aufrufen, zum Beispiel linfit([1,2,3]) gibt:

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 ]]) 

Wenn Sie nur eine lineare Interpolation zu tun, können Sie auch nur so etwas wie:

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

direkt den interpolierten Vektor zu jedem Zeitpunkt t zu berechnen.