Как я могу использовать интерполяцию ближайшего соседа только за пределами границ при использовании RegularGridInterpolator

#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()  

Результаты интерполяции