我需要一个更快的解决方案来将一维的 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
建议深表感谢