# fast interpolator that use the regular grid structure (x and y are 1D arrays)
z = z_masked.filled(np.nan)
zinterp = RegularGridInterpolator((x, y), z.T)
# new grid to interpolate on
X2, Y2 = np.meshgrid(x2, y2)
newpoints = np.array((X2, Y2)).T
# actual interpolation
z2 = zinterp(newpoints)
z2_masked = np.ma.array(z2, mask=np.isnan(z2))
# fast interpolator that use the regular grid structure (x and y are 1D arrays)
zinterp = RegularGridInterpolator((x, y), z.T)
minterp = RegularGridInterpolator((x, y), (mask+0.).T)
# actual interpolation
z2 = zinterp(newpoints)
mask2 = minterp(newpoints) > 0 # apply threshold, e.g. 0.5 is considered contaminated and will be removed.
z2[mask2] = np.nan # fill with nans or whatever missing data flag
3条答案
按热度按时间m1m5dgzv1#
实际上,你可以使用每一个接受
x, y, z
的函数(interp2d就是这样,其他的也可能是这样)来处理你的掩码数据。但是你需要显式地创建一个mgrid
:字符串
然后,您需要删除所有这些坐标中的所有掩码值:
型
使用这些最终的
x, y, z
,您可以调用指定的每个函数(它接受不完整的格网,因此RectBivariateSpline
将不起作用)。但是请注意,其中一些使用插值框,因此如果由于掩码而丢弃数据的区域太大,则插值将在那里失败(结果是np.nan
或0)。但是如果发生这种情况,您可以调整参数以进行补偿。例如:
型
你可以看到0的小区域,因为掩码有很多掩码值:
型
ahy6op9u2#
@MSeifert概述的方法的问题是丢失了规则的网格结构,导致插值效率低下。只有通过插值来填充缺失的数据才是合理的,但不适用于从一个网格到另一个网格的典型插值,其中缺失的数据不应该被填充。
在这种情况下,使用np.nan填充缺失值是最简单的方法。这些将在计算中传播,并且所得数组将在缺失值用于插值的任何地方都具有nans。
字符串
为了完整起见,另一种方法是插值第二个
mask
数组(在数据缺失的地方填充1,否则填充0)来填充新网格上的缺失值。型
注意,如果需要样条插值,这两种方法都应该与BivariateSpline一起工作。无论哪种方式,这都应该比使用interp 2d快得多。
bpzcxfmw3#
我通常遵循@mseifert描述的方法,但如果我厌倦了通过掩蔽区域的插值误差,则添加以下改进。这似乎是您的关注点之一,@ hurrdraw?这个想法是将掩码传播到插值结果。一维数据的一个简单示例是:
字符串