Bivariate strukturierte Interpolation eines großen Arrays mit NaN-Werten oder Maske

Ich versuche regelmäßig gerastert zu interpolierenwindstress Daten mit Scipy'sRectBivariateSpline Klasse. An einigen Rasterpunkten enthalten die Eingabedaten ungültige Dateneinträge, die auf NaN-Werte gesetzt sind. Zunächst habe ich die Lösung verwendet, umScotts Frage auf zweidimensionale Interpolation. Unter Verwendung meiner Daten gibt die Interpolation ein Array zurück, das nur NaNs enthält. Ich habe auch einen anderen Ansatz ausprobiert, vorausgesetzt, meine Daten sind unstrukturiert und verwenden dieSmoothBivariateSpline Klasse. Anscheinend habe ich zu viele Datenpunkte, um unstrukturierte Interpolation zu verwenden, da die Form des Datenarrays (719 x 2880) ist.

Um mein Problem zu veranschaulichen, habe ich das folgende Skript erstellt:

from __future__ import division
import numpy
import pylab

from scipy import interpolate


# The signal and lots of noise
M, N = 20, 30  # The shape of the data array
y, x = numpy.mgrid[0:M+1, 0:N+1]
signal = -10 * numpy.cos(x / 50 + y / 10) / (y + 1)
noise = numpy.random.normal(size=(M+1, N+1))
z = signal + noise


# Some holes in my dataset
z[1:2, 0:2] = numpy.nan
z[1:2, 9:11] = numpy.nan
z[0:1, :12] = numpy.nan
z[10:12, 17:19] = numpy.nan


# Interpolation!
Y, X = numpy.mgrid[0.125:M:0.5, 0.125:N:0.5]
sp = interpolate.RectBivariateSpline(y[:, 0], x[0, :], z)
Z = sp(Y[:, 0], X[0, :])

sel = ~numpy.isnan(z)
esp = interpolate.SmoothBivariateSpline(y[sel], x[sel], z[sel], 0*z[sel]+5)
eZ = esp(Y[:, 0], X[0, :])


# Comparing the results
pylab.close('all')
pylab.ion()

bbox = dict(edgecolor='w', facecolor='w', alpha=0.9)
crange = numpy.arange(-15., 16., 1.)

fig = pylab.figure()
ax = fig.add_subplot(1, 3, 1)
ax.contourf(x, y, z, crange)
ax.set_title('Original')
ax.text(0.05, 0.98, 'a)', ha='left', va='top', transform=ax.transAxes, 
    bbox=bbox)

bx = fig.add_subplot(1, 3, 2, sharex=ax, sharey=ax)
bx.contourf(X, Y, Z, crange)
bx.set_title('Spline')
bx.text(0.05, 0.98, 'b)', ha='left', va='top', transform=bx.transAxes, 
    bbox=bbox)

cx = fig.add_subplot(1, 3, 3, sharex=ax, sharey=ax)
cx.contourf(X, Y, eZ, crange)
cx.set_title('Expected')
cx.text(0.05, 0.98, 'c)', ha='left', va='top', transform=cx.transAxes, 
    bbox=bbox)

Was zu folgenden Ergebnissen führt:

Die Abbildung zeigt eine konstruierte Datenkarte (a) und die Ergebnisse mit den Klassen RectBivariateSpline (b) und SmoothBivariateSpline (c) von Scipy. Die erste Interpolation führt zu einem Array mit nur NaNs. Idealerweise hätte ich ein Ergebnis ähnlich der zweiten Interpolation erwartet, die rechenintensiver ist. Ich benötige nicht unbedingt eine Datenextrapolation außerhalb der Domain-Region.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage