#python #scipy #interpolation
Вопрос:
Используя RegularGridInterpolator
для получения значений за пределами оболочки (границ) входных данных, можно выбирать между экстраполяцией или фиксированными значениями. Как я могу получить линейную интерполяцию внутри корпуса и интерполяцию ближайшего соседа за пределами корпуса?
Ответ №1:
В следующем классе используются два интерполятора. Первый устанавливает все значения за пределами корпуса на 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()