在Python中以1D插值3D蒙版数组

时间:2018-09-28 20:49:09

标签: python multidimensional-array interpolation masked-array

我需要一种更快的解决方案,以将3D数组在一维内插到2D表面。我的数据是网格化的(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,但是有一个问题和一个问题:问题是,当我实际上只需要在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

建议深表感谢

0 个答案:

没有答案