2016-06-25 6 views
1

Die Dokumentation für scipy.interpolate.interp1d ist still, was passiert, wenn es Bindungen in der x Argument gibt. Mein Experimentierens legt nahe, dass es die ganz rechts zurückgibt, wenn die genaue x-Wert angefordert wird, und verwendet den nächsten ein, wenn Interpolations-:Wie interp1d in scipy behandeln Bindungen

from scipy.interpolate import interp1d 
temp = interp1d([0, 1, 1, 2], [1, 2, 3, 4]) 
temp(0.5) # 1.5 
temp(1) # 3.0 
temp(1.5) # 3.5 

wird dies durch die Konstruktion des Interpolators gewährleistet?

+0

Beschränken Sie die Frage auf die Standardart "linear"? – hpaulj

+0

Im Moment interessieren mich nur die linearen Algorithmen, aber wenn man das Verhalten kennt, können die Alternativen für die Zukunft nützlich sein. – drhagen

Antwort

1

interp1d ist definiert in scipy/interpolate/interpolate.py. Für den Standardtyp "linear" erscheinen zwei Alternativen.

  # Check if we can delegate to numpy.interp (2x-10x faster). 
      if (not np.issubdtype(self.y.dtype, np.complexfloating) and 
       self.y.ndim == 1 and 
       not _do_extrapolate(fill_value)): 
       self._call = self.__class__._call_linear_np 
      else: 
       self._call = self.__class__._call_linear 

Die call_linear_np tut:

np.interp(x_new, self.x, self.y) 

Die Funktionsaufrufe Code kompiliert. Die Dokumente sprechen davon, dass die Erhöhung von xp erwartet wird, aber dies wird nicht überprüft.

def _call_linear(self, x_new): 

scheint alles Python zu sein, das Sie studieren können.

Was Sie beschreiben, ist, was ich für lineare Interpolation erwarten würde. Aber denken Sie daran, dass dieser Code mit Gleitkommazahlen arbeitet und "genaue Gleichheit" nicht mit Gleitkommazahlen garantiert ist.

1

Nein, es ist nicht garantiert.

Das Verhalten eines Interpolators, wenn Bindungen in x Werte sind, ist nicht definiert und kann zwischen scipy Versionen wechseln. (Auch die Art der Interpolation und wo in den Arrays sind die Bindungen).