Двумерная структурированная интерполяция большого массива со значениями NaN или маской

Я пытаюсь интерполировать регулярно сеткуwindstress данные с использованием Scipy'sRectBivariateSpline класс. В некоторых точках сетки входные данные содержат недопустимые записи данных, для которых установлены значения NaN. Для начала я использовал решение дляВопрос Скотта на двумерной интерполяции. Используя мои данные, интерполяция возвращает массив, содержащий только NaN. Я также попробовал другой подход, предполагая, что мои данные неструктурированы и используяSmoothBivariateSpline класс. По-видимому, у меня слишком много точек данных, чтобы использовать неструктурированную интерполяцию, поскольку форма массива данных (719 x 2880).

Чтобы проиллюстрировать мою проблему, я создал следующий скрипт:

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)

Что дает следующие результаты:

На рисунке показана построенная карта данных (a) и результаты с использованием классов Scipy RectBivariateSpline (b) и SmoothBivariateSpline (c). Первая интерполяция приводит к массиву только с NaN. В идеале я бы ожидал результат, аналогичный второй интерполяции, которая требует больших вычислительных ресурсов. Мне не обязательно нужна экстраполяция данных за пределы области домена.

Ответы на вопрос(1)

Ваш ответ на вопрос