Ihre X
Werte umgekehrt sind, scipy.interpolate.spline
erfordert die unabhängige Variable monoton steigend zu sein, und Diese Methode ist veraltet - verwenden Sie stattdessen interp1d
(siehe unten).
>>> from scipy.interpolate import spline
>>> import numpy as np
>>> X = [736176.0, 736175.0, 736174.0] # <-- your original X is decreasing
>>> Y = [711.74, 730.0, 698.0]
>>> Xsmooth = np.linspace(736174.0, 736176.0, 10)
>>> spline(X, Y, Xsmooth)
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
Reverse X
und Y
erste und es funktioniert
>>> spline(
... list(reversed(X)), # <-- reverse order of X so also
... list(reversed(Y)), # <-- reverse order of Y to match
... Xsmooth
...)
array([ 698. , 262.18297973, 159.33767533, 293.62017489,
569.18656683, 890.19293934, 1160.79538066, 1285.149979 ,
1167.41282274, 711.74 ])
Beachten Sie, dass viele Spline-Interpolationsverfahren X
erfordern monoton zu steigen:
x
: (N,) array_like - 1-D array of independent input data. Must be increasing.
x
: (N,) array_like - Input dimension of data points – must be increasing
Die Standardreihenfolge von scipy.interpolate.spline
ist kubisch. Da es nur 3 Datenpunkte gibt, gibt es große Unterschiede zwischen einem kubischen Spline (order=3
) und einem quadratischen Spline (order=2
). Die folgende Grafik zeigt den Unterschied zwischen Splines unterschiedlicher Ordnung. Hinweis: 100 Punkte wurden glatt verwendet die angepasste Kurve mehr.
Die Dokumentation für scipy.interpolate.spline
ist vage und schlägt vor, sie nicht unterstützt werden kann. Zum Beispiel ist es nicht auf der scipy.interpolate
main page oder auf der interploation tutorial aufgeführt. Die source for spline
zeigt, dass es spleval
und splmake
tatsächlich Anrufe, die unter Additional Tools wie aufgeführt sind:
Functions existing for backward compatibility (should not be used in new code).
würde ich cricket_007 ‚s Vorschlag folgen und interp1d
verwenden.Es ist die derzeit vorgeschlagene Methode, sie ist sehr gut dokumentiert mit detailed examples in both the tutorial und API, und es ermöglicht die unabhängige Variable unsortiert (Reihenfolge) standardmäßig (siehe assume_sorted
Argument in API).
>>> from scipy.interpolate import interp1d
>>> f = interp1d(X, Y, kind='quadratic')
>>> f(Xsmooth)
array([ 711.74 , 720.14123457, 726.06049383, 729.49777778,
730.45308642, 728.92641975, 724.91777778, 718.4271605 ,
709.4545679 , 698. ])
Auch wird es einen Fehler auslösen, wenn die Daten rank deficient sind.
>>> f = interp1d(X, Y, kind='cubic')
ValueError: x and y arrays must have at least 4 entries
Ich habe gerade versucht, ein Beispiel, und Ihr Ansatz für mich gearbeitet. Versuchen Sie, jede Zeile zu debuggen. Was sind die Werte von 'Xnew.min()' und 'Xnew.max()'? Veröffentlichen Sie weitere Details. Was sind die Werte von 'X',' X_smooth', 'Xnew'. Für [Debugging in einem IPython während der Ausführung versuchen Sie '% debug'] (https://ipython.org/ipython-doc/1/interactive/tutorial.html#debugging) [Haltepunkte hinzufügen] (https: // docs. python.org/2/library/pdb.html#debugger-commands) oder verwenden Sie [logging] (https://docs.python.org/2/library/logging.html), um während der Ausführung Zwischenwerte anzuzeigen. –
Ich habe die Frage bearbeitet und die Variablen hinzugefügt – AimiHat
Aus Ihrer Ausgabe folgere ich, dass Sie Problem mit Spline sind, nicht das Datum mal. Kannst du deine Frage anders formulieren? Und vielleicht versuchen Sie Ihr Problem mit einem kleineren Satz von Zahlen, wie 10 statt 300, die einfacher in SO angezeigt werden und einfacher zu debuggen sind. Überprüfen Sie auch die 'np.splie' Dokumente sorgfältig –