Интерполировать в 1D 3D-массив в Python - PullRequest
0 голосов
/ 28 сентября 2018

Мне нужно более быстрое решение для интерполяции трехмерного массива в одном измерении на двухмерную поверхность.Мои данные привязаны к сетке (k, j, i): горизонтальная сетка является регулярной (j, i), но вертикальная сетка - нет (т.е. точки глубины различны в каждой точке i, j).Кроме того, мой массив имеет 2D горизонтальную маску.Мое текущее решение:

from scipy.interpolate import interp1d

def interpz(depths, var, z_levs):
    var_z = np.zeros_like(var[0,:,:])
    for j in range(var_z.shape[0]):
        for i in range(var_z.shape[1]):
            if var_z.mask[j,i]==False:
                f = interp1d(depths[:,j,i], var[:,j,i])
                var_z[j,i] =  f(z_levs[j,i])   
    return var_z

Это работает, но это слишком медленно (моя горизонтальная сетка составляет около 200x600, и количество интерполяций значительно уменьшается с маской, но это все еще занимает около часа).

Я изучил griddata, но есть одна проблема и одна проблема: проблема, она использует все значения для интерполяции точки, когда мне фактически требуется только 1D интерполяция в направлении z (что,что угодно), НО проблема в том, что, по-видимому, ему не нравятся nans (на самом деле. не фактические NaN, а маскированные значения):

z, y, x = depths.flatten(), y.flatten(), x.flatten()
data =  var.flatten()
var_z = griddata((z, y, x), data, (z_levs.flatten(), y[0,:,:].flatten(), 
...: x[0].flatten()), method='linear')

Я получаю:

in griddata(points, values, xi, method, fill_value, rescale)
    215     elif method == 'linear':
    216         ip = LinearNDInterpolator(points, values, fill_value=fill_value,
--> 217                                   rescale=rescale)
    218         return ip(xi)
    219     elif method == 'cubic' and ndim == 2:

scipy/interpolate/interpnd.pyx in scipy.interpolate.interpnd.LinearNDInterpolator.__init__ (scipy/interpolate/interpnd.c:5530)()

scipy/spatial/qhull.pyx in scipy.spatial.qhull.Delaunay.__init__ (scipy/spatial/qhull.c:18174)()

scipy/spatial/qhull.pyx in scipy.spatial.qhull._Qhull.__init__ (scipy/spatial/qhull.c:4788)()

ValueError: Points cannot contain NaN

Предложения высоко ценятся

...