Scipy Interpolation mit maskierten Daten?

Ich versuche, ein 2D-Array zu interpolieren, das die maskierten Daten enthält. Ich habe einige der verfügbaren Methoden des SciPy-Moduls verwendet, darunter interp2d , bisplrep/bisplev , sowie RectBivariateSpline . Als zusätzliche Information sind meine Daten ein regelmäßiges Array, was bedeutet, dass Gitter die gleiche Dimension haben (in diesem Fall 1ºX1º).

Having said that, gibt es eine Möglichkeit zu interpolieren vermeiden maskierte Daten in einem Array mit Python? Ich bin immer noch neu mit Python und NumPy / SciPy Module.

  • Python - Alternative für die Verwendung von numpy Array als Schlüssel im Wörterbuch
  • Warum kann ich nicht die Form dieses numpy Arrays bekommen?
  • Wie erstelle ich ArrayType für WSDL in Python (mit Suds)?
  • Eine 2D-Matrix von Strings erstellen, um Mesh-Koordinaten anzupassen
  • Speichern und Laden von numpy Arrays als Dateien
  • Erstellen Sie ein Wörterbuch mit Listenverstehen in Python
  • 2 Solutions collect form web for “Scipy Interpolation mit maskierten Daten?”

    Sie können tatsächlich jede Funktion verwenden, die x, y, z (das ist der Fall für interp2d und wahrscheinlich auch die anderen) mit Ihren maskierten Daten akzeptiert. Aber du musst explizit ein mgrid erstellen:

     z = ... # Your data x, y = np.mgrid[0:z.shape[0], 0:z.shape[1]] 

    Dann müssen Sie alle maskierten Werte in all diesen Koordinaten löschen:

     x = x[~z.mask] y = y[~z.mask] z = z[~z.mask] 

    Mit diesen endgültigen x, y, z kannst du alle Ihre spezifizierten Funktionen aufrufen (die unvollständige Gitter akzeptiert, also RectBivariateSpline nicht funktioniert). Beachten Sie jedoch, dass einige von diesen Interpolationsboxen verwenden, wenn es eine zu große Region gibt, in der Sie die Daten wegen Ihrer Maske verworfen haben, wird die Interpolation dort fehlschlagen (was zu np.nan oder 0 führt). Aber du könntest die Parameter zwicken, um das zu kompensieren, wenn es passiert.

    Beispielsweise:

     data = np.random.randint(0, 10, (5,5)) mask = np.random.uniform(0,1,(5,5)) > 0.5 z = np.ma.array(data, mask=mask) x, y = np.mgrid[0:z.shape[0], 0:z.shape[1]] x1 = x[~z.mask] y1 = y[~z.mask] z1 = z[~z.mask] interp2d(x1, y1, z1)(np.arange(z.shape[0]), np.arange(z.shape[1])) array([[ 1.1356716 , 2.45313727, 3.77060294, 6.09790177, 9.31328935], [ 3.91917937, 4. , 4.08082063, 3.98508121, 3.73406764], [ 42.1933738 , 25.0966869 , 8. , 0. , 0. ], [ 1.55118338, 3. , 4.44881662, 4.73544593, 4. ], [ 5. , 8. , 11. , 9.34152525, 3.58619652]]) 

    Sie können die kleine Fläche von 0 sehen, weil die Maske dort viele maskierte Werte hatte:

     mask array([[False, True, True, True, False], [False, False, True, False, False], [ True, True, False, True, True], [False, True, False, True, True], [False, True, False, False, True]], dtype=bool) data array([[2, 4, 4, 5, 5], [1, 4, 1, 3, 8], [9, 1, 8, 0, 9], [7, 2, 0, 3, 4], [9, 6, 0, 4, 4]]) 

    Ich folge typischerweise dem von @mseifert beschriebenen Ansatz, aber füge die folgende Verfeinerung hinzu, wenn ich den Interpolationsfehler durch die maskierten Bereiche müde bin. Das scheint eine Ihrer Anliegen zu sein, @hurrdrought? Die Idee ist, die Maske zum interpolierten Ergebnis zu verbreiten. Ein einfaches Beispiel für 1D-Daten ist:

     def ma_interp(newx,x,y,mask,propagate_mask=True): newy = np.interp(newx,x[~mask],y[~mask]) # interpolate data if propagate_mask: # interpolate mask & apply to interpolated data newmask = mask[:] newmask[mask] = 1; newmask[~mask] = 0 newmask = np.interp(newx,x,newmask) newy = np.ma.masked_array(newy, newmask>0.5) return newy 
    Python ist die beste Programmiersprache der Welt.