RegularGridInterpolator#
- класс scipy.interpolate.RegularGridInterpolator(точки, values, метод='linear', bounds_error=True, fill_value=nan, *, solver=None, solver_args=None)[источник]#
Интерполятор указанного порядка на прямоугольной сетке в N ≥ 1 измерений.
Данные должны быть определены на прямоугольной сетке; то есть на прямоугольной сетке с равномерным или неравномерным шагом. Поддерживаются линейная, ближайшего соседа и сплайновая интерполяции. После настройки объекта-интерполятора метод интерполяции может быть выбран при каждом вычислении.
- Параметры:
- точкикортеж ndarray из чисел с плавающей запятой, с формами (m1, ), …, (mn, )
Точки, определяющие регулярную сетку в n измерениях. Точки в каждом измерении (т.е. каждый элемент кортежа points) должны быть строго возрастающими или убывающими.
- valuesarray_like, shape (m1, …, mn, …)
Данные на регулярной сетке в n измерениях. Принимаются комплексные данные.
- методstr, optional
Метод интерполяции для выполнения. Поддерживаются "linear", "nearest", "slinear", "cubic", "quintic" и "pchip". Этот параметр станет значением по умолчанию для объекта
__call__метод. По умолчанию — "linear".- bounds_errorbool, необязательно
Если True, при запросе интерполированных значений вне области входных данных возникает ValueError. Если False, то fill_value используется. По умолчанию True.
- fill_valuefloat или None, опционально
Значение для использования в точках вне области интерполяции. Если None, значения вне области экстраполируются. По умолчанию
np.nan.- solverвызываемый объект, необязательный
Используется только для методов "slinear", "cubic" и "quintic". Разреженный решатель линейной алгебры для построения экземпляра NdBSpline. По умолчанию используется итеративный решатель
scipy.sparse.linalg.gcrotmk.Добавлено в версии 1.13.
- solver_args: dict, optional
Дополнительные аргументы для передачи в solver, если есть.
Добавлено в версии 1.13.
- Атрибуты:
- сеткакортеж ndarrays
Точки, определяющие регулярную сетку в n измерениях. Этот кортеж определяет полную сетку через
np.meshgrid(*grid, indexing='ij')- valuesndarray
Значения данных на сетке.
- методstr
Метод интерполяции.
- fill_valuefloat или
None Используйте это значение для аргументов вне границ в
__call__.- bounds_errorbool
Если
True, аргумент вне границ вызываетValueError.
Методы
__call__(xi[, method, nu])Интерполяция по координатам.
Смотрите также
NearestNDInterpolatorИнтерполятор ближайшего соседа на неструктурированный данные в N измерениях
LinearNDInterpolatorКусочно-линейный интерполятор на неструктурированный данные в N измерениях
interpnудобная функция, которая оборачивает
RegularGridInterpolatorscipy.ndimage.map_coordinatesинтерполяция на сетках с равным шагом (подходит, например, для передискретизации N-мерных изображений)
Примечания
В отличие от
LinearNDInterpolatorиNearestNDInterpolator, этот класс избегает дорогостоящей триангуляции входных данных, используя преимущества структуры регулярной сетки.Другими словами, этот класс предполагает, что данные определены на прямолинейный сетка.
Добавлено в версии 0.14.
Методы 'slinear'(k=1), 'cubic'(k=3) и 'quintic'(k=5) являются интерполяторами сплайнов тензорного произведения, где k является степенью сплайна, Если любое измерение имеет меньше точек, чем k + 1, будет вызвана ошибка.
Добавлено в версии 1.9.
Если входные данные таковы, что размерности имеют несоизмеримые единицы измерения и отличаются на много порядков величины, интерполянт может иметь числовые артефакты. Рассмотрите возможность масштабирования данных перед интерполяцией.
Выбор решателя для методов сплайнов
Методы сплайнов, «slinear», «cubic» и «quintic», включают решение большой разреженной линейной системы во время инициализации. В зависимости от данных стандартный решатель может быть или не быть адекватным. Если он не подходит, может потребоваться экспериментировать с опциональным solver аргумент, где вы можете выбрать между прямым решателем (
scipy.sparse.linalg.spsolve) или итерационные решатели изscipy.sparse.linalg. Возможно, вам потребуется предоставить дополнительные параметры через необязательный solver_args параметр (например, вы можете предоставить начальное значение или целевую погрешность). См.scipy.sparse.linalgдокументация для полного списка доступных опций.В качестве альтернативы вы можете использовать устаревшие методы "slinear_legacy", "cubic_legacy" и "quintic_legacy". Эти методы позволяют более быстрое построение, но вычисления будут значительно медленнее.
Правило округления в половинных точках с методом `nearest`
Правило округления с ближайший метод в половинных точках округляет вниз.
Ссылки
[1]Пакет Python regulargrid Йоханнеса Бюхнера, см. https://pypi.python.org/pypi/regulargrid/
[2]Википедия, "Trilinear interpolation", https://en.wikipedia.org/wiki/Trilinear_interpolation
[3]Вайзер, Алан и Серхио Э. Заратонтелло. «Заметка о кусочно-линейной и мультилинейной табличной интерполяции во многих измерениях». MATH. COMPUT. 50.181 (1988): 189-196. https://www.ams.org/journals/mcom/1988-50-181/S0025-5718-1988-0917826-0/S0025-5718-1988-0917826-0.pdf DOI:10.1090/S0025-5718-1988-0917826-0
Примеры
Вычислить функцию в точках 3-D сетки
В качестве первого примера мы вычисляем простую примерную функцию в точках трехмерной сетки:
>>> from scipy.interpolate import RegularGridInterpolator >>> import numpy as np >>> def f(x, y, z): ... return 2 * x**3 + 3 * y**2 - z >>> x = np.linspace(1, 4, 11) >>> y = np.linspace(4, 7, 22) >>> z = np.linspace(7, 9, 33) >>> xg, yg ,zg = np.meshgrid(x, y, z, indexing='ij', sparse=True) >>> data = f(xg, yg, zg)
dataтеперь является 3-D массивом сdata[i, j, k] = f(x[i], y[j], z[k]). Затем определите интерполирующую функцию из этих данных:>>> interp = RegularGridInterpolator((x, y, z), data)
Вычислить интерполирующую функцию в двух точках
(x,y,z) = (2.1, 6.2, 8.3)и(3.3, 5.2, 7.1):>>> pts = np.array([[2.1, 6.2, 8.3], ... [3.3, 5.2, 7.1]]) >>> interp(pts) array([ 125.80469388, 146.30069388])
что действительно является близким приближением к
>>> f(2.1, 6.2, 8.3), f(3.3, 5.2, 7.1) (125.54200000000002, 145.894)
Интерполировать и экстраполировать 2D набор данных
В качестве второго примера мы интерполируем и экстраполируем двумерный набор данных:
>>> x, y = np.array([-2, 0, 4]), np.array([-2, 0, 2, 5]) >>> def ff(x, y): ... return x**2 + y**2
>>> xg, yg = np.meshgrid(x, y, indexing='ij') >>> data = ff(xg, yg) >>> interp = RegularGridInterpolator((x, y), data, ... bounds_error=False, fill_value=None)
>>> import matplotlib.pyplot as plt >>> fig = plt.figure() >>> ax = fig.add_subplot(projection='3d') >>> ax.scatter(xg.ravel(), yg.ravel(), data.ravel(), ... s=60, c='k', label='data')
Оценить и построить интерполятор на более мелкой сетке
>>> xx = np.linspace(-4, 9, 31) >>> yy = np.linspace(-4, 9, 31) >>> X, Y = np.meshgrid(xx, yy, indexing='ij')
>>> # interpolator >>> ax.plot_wireframe(X, Y, interp((X, Y)), rstride=3, cstride=3, ... alpha=0.4, color='m', label='linear interp')
>>> # ground truth >>> ax.plot_wireframe(X, Y, ff(X, Y), rstride=3, cstride=3, ... alpha=0.4, label='ground truth') >>> plt.legend() >>> plt.show()
Другие примеры приведены в учебнике.