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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage