scipy interp2d / bisplrep unerwartete Ausgabe bei 1D-Eingabe
Ich habe ungültige Eingabefehler bei der Arbeit mit scipyinterp2d
Funktion. Es stellt sich heraus, dass das Problem von der @ kombisplrep
Funktion, wie hier gezeigt:
import numpy as np
from scipy import interpolate
# Case 1
x = np.linspace(0,1)
y = np.zeros_like(x)
z = np.ones_like(x)
tck = interpolate.bisplrep(x,y,z) # or interp2d
Kehrt zurück:ValueError: Invalid inputs
Es stellte sich heraus, die Testdaten, die ich gabinterp2d
enthielt nur einen eindeutigen Wert für die 2. Achse, wie im obigen Testbeispiel. Dasbisplrep
Funktion innerhalb voninterp2d
betrachtet es als ungültige Ausgabe: Dies kann als akzeptables Verhalten angesehen werden:interp2d
& bisplrep
Erwarten Sie ein 2D-Gitter, und ich gebe ihnen nur Werteentlang einer Zeile.
Eine Randnotiz, ich finde die Fehlermeldung ziemlich unübersichtlich. Man könnte einen Test in @ aufnehminterp2d
, um mit solchen Fällen umzugehen: Etwas im Sinne von
if len(np.unique(x))==1 or len(np.unique(y))==1:
ValueError ("Can't build 2D splines if x or y values are all the same")
kann ausreichen, um diese Art ungültiger Eingaben zu erkennen und eine explizitere Fehlermeldung auszulösen, oder sogar direkt das geeignetere @ aufzurufeinterp1d
Funktion (die hier perfekt funktioniert)
Ich dachte, ich hätte das Problem richtig verstanden. Beachten Sie jedoch das folgende Codebeispiel:
# Case 2
x = np.linspace(0,1)
y = x
z = np.ones_like(x)
tck = interpolate.bisplrep(x,y,z)
In diesem Fall,y
ist proportional zux
, Ich füttere auchbisplrep
mit Daten entlang einer Linie. Aber überraschenderweisebisplrep
kann in diesem Fall eine 2D-Spline-Interpolation berechnen. Ich habe es gezeichnet:
# Plot
def plot_0to1(tck):
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
X = np.linspace(0,1,10)
Y = np.linspace(0,1,10)
Z = interpolate.bisplev(X,Y,tck)
X,Y = np.meshgrid(X,Y)
fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(X, Y, Z,rstride=1, cstride=1, cmap=cm.coolwarm,
linewidth=0, antialiased=False)
plt.show()
plot_0to1(tck)
Das Ergebnis ist das folgende:
wobisplrep
scheint die Lücken mit Nullen zu füllen, wie besser zu sehen ist, wenn ich den Plot unten erweitere:
In Bezug darauf, ob das Hinzufügen von 0 erwartet wird, lautet meine eigentliche Frage:warum tutbisplrep
Arbeit in Fall 2, aber nicht in Fall 1?
Oder, mit anderen Worten: Wollen wir, dass es einen Fehler zurückgibt, wenn die 2D-Interpolation mit Eingaben nur in einer Richtung gespeist wird (Fall 1 & 2 schlagen fehl), oder nicht? (Fall 1 & 2 sollten etwas zurückgeben, auch wenn sie nicht vorhergesagt wurden.)