Interpolação estruturada bivariada de grande matriz com valores NaN ou máscara

Eu estou tentando interpolar regularmente griddedwindstress dados usando Scipy'sRectBivariateSpline classe. Em alguns pontos de grade, os dados de entrada contêm entradas de dados inválidas, que são definidas como valores NaN. Para começar, usei a solução paraPergunta de Scott na interpolação bidimensional. Usando meus dados, a interpolação retorna um array contendo apenas NaNs. Eu também tentei uma abordagem diferente, assumindo que meus dados não são estruturados e usando oSmoothBivariateSpline classe. Aparentemente eu tenho muitos pontos de dados para usar a interpolação não estruturada, uma vez que a forma da matriz de dados é (719 x 2880).

Para ilustrar meu problema, criei o seguinte script:

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)

Que dá os seguintes resultados:

A figura mostra um mapa de dados construído (a) e os resultados usando as classes RectBivariateSpline (b) e SmoothBivariateSpline (c) de Scipy. A primeira interpolação resulta em um array com apenas NaNs. Idealmente, eu esperaria um resultado semelhante à segunda interpolação, que é mais computacionalmente intensiva. Eu não preciso necessariamente de extrapolação de dados fora da região do domínio.

questionAnswers(1)

yourAnswerToTheQuestion