首页 > 解决方案 > 使用RegularGridInterpolator时,如何仅在边界之外使用最近邻插值

问题描述

用于RegularGridInterpolator获取输入数据的外壳(边界)之外的值,可以在外推值或固定值之间进行选择。如何在船体内部获得线性插值,在船体外部获得最近邻插值?

标签: pythonscipyinterpolation

解决方案


下面的类使用两个插值器。第一个将船体外部的所有值设置为np.nan. 第二个插值器仅对这些nan值进行最近邻插值。

class RegularGridInterpolatorNNextrapol:
    def __init__( self, points, values, method='linear' ):
        self.interp = RegularGridInterpolator(points, values, method=method,
                                              bounds_error=False, fill_value=np.nan)
        self.nearest = RegularGridInterpolator(points, values, method='nearest',
                                           bounds_error=False, fill_value=None)

    def __call__( self, xi ):
        vals = self.interp( xi )
        idxs = np.isnan( vals )
        vals[idxs] = self.nearest( xi[idxs] )
        return vals

这是一个导致下图的示例:

x = np.linspace( -0.5, 0.5, 5 )
y = np.linspace( -0.5, 0.5, 5 )
X1, Y1 = np.meshgrid(x, y)
z = np.hypot(X1, Y1)

interp = RegularGridInterpolatorNNextrapol((x,y), z)

X = np.linspace(min(x)-0.2, max(x)+0.2,40)
Y = np.linspace(min(y)-0.2, max(y)+0.2,40)
X, Y = np.meshgrid(X, Y)  # 2D grid for interpolation

pts = np.column_stack((X.flatten(),Y.flatten()))
Z = interp( pts )

plt.pcolormesh(X, Y, Z.reshape(X.shape), shading='auto')
plt.plot(X1, Y1, "ok" )
plt.legend()
plt.colorbar()
plt.axis("equal")
plt.show()

插值结果


推荐阅读