RectSphereBivariateSpline#
- класс scipy.interpolate.RectSphereBivariateSpline(u, v, r, s=0.0, pole_continuity=False, pole_values=None, pole_exact=False, pole_flat=False)[источник]#
Бивариативная сплайн-аппроксимация по прямоугольной сетке на сфере.
Может использоваться для сглаживания данных.
Добавлено в версии 0.11.0.
- Параметры:
- uarray_like
Одномерный массив координат широты в строго возрастающем порядке. Координаты должны быть заданы в радианах и лежать в открытом интервале
(0, pi).- varray_like
Одномерный массив координат долготы в строго возрастающем порядке. Координаты должны быть заданы в радианах. Первый элемент (
v[0]) должен лежать в интервале[-pi, pi). Последний элемент (v[-1]) должно удовлетворятьv[-1] <= v[0] + 2*pi.- rarray_like
2-мерный массив данных с формой
(u.size, v.size).- sfloat, опционально
Положительный коэффициент сглаживания, определённый для условия оценки (
s=0предназначен для интерполяции).- pole_continuitybool или (bool, bool), опционально
Порядок непрерывности на полюсах
u=0(pole_continuity[0]) иu=pi(pole_continuity[1]). Порядок непрерывности на полюсе будет 1 или 0, когда это True или False, соответственно. По умолчанию False.- pole_valuesfloat или (float, float), опционально
Значения данных на полюсах
u=0иu=pi. Либо весь параметр, либо каждый отдельный элемент может быть None. По умолчанию None.- pole_exactbool или (bool, bool), опционально
Точность значений данных на полюсах
u=0иu=pi. Если True, значение считается правым значением функции и будет точно аппроксимировано. Если False, значение будет считаться данными, как и другие значения данных. По умолчанию False.- pole_flatbool или (bool, bool), опционально
Для полюсов в
u=0иu=pi, укажите, имеет ли аппроксимация исчезающие производные. По умолчанию False.
Методы
__call__(theta, phi[, dtheta, dphi, grid])Вычисление сплайна или его производных в заданных позициях.
ev(theta, phi[, dtheta, dphi])Вычислить сплайн в точках
Вернуть коэффициенты сплайна.
Возвращает кортеж (tx,ty), где tx,ty содержат позиции узлов сплайна относительно переменных x и y соответственно.
Возвращает взвешенную сумму квадратов невязок аппроксимации сплайном: sum ((w[i]*(z[i]-s(x[i],y[i])))**2,axis=0)
partial_derivative(dx, dy)Построить новый сплайн, представляющий частную производную этого сплайна.
Смотрите также
BivariateSplineбазовый класс для двумерных сплайнов.
UnivariateSplineгладкий одномерный сплайн для аппроксимации заданного набора точек данных.
SmoothBivariateSplineсглаживающий двумерный сплайн через заданные точки
LSQBivariateSplineдвумерный сплайн с использованием взвешенного метода наименьших квадратов
SmoothSphereBivariateSplineсглаживающий двумерный сплайн в сферических координатах
LSQSphereBivariateSplineдвумерный сплайн в сферических координатах с использованием взвешенного метода наименьших квадратов
RectBivariateSplineдвумерный сплайн на прямоугольной сетке.
bisplrepфункция для нахождения бивариантного B-сплайнового представления поверхности
bisplevфункция для вычисления двумерного B-сплайна и его производных
Примечания
В настоящее время только аппроксимация сглаживающим сплайном (
iopt[0] = 0иiopt[0] = 1в процедуре FITPACK) поддерживается. Точная аппроксимация сплайнами методом наименьших квадратов ещё не реализована.При фактическом выполнении интерполяции запрошенные v значения должны лежать в том же интервале длины 2pi, что и исходные v значения были выбраны из.
Для получения дополнительной информации см. FITPACK сайт об этой функции.
Примеры
Предположим, у нас есть глобальные данные на грубой сетке
>>> import numpy as np >>> lats = np.linspace(10, 170, 9) * np.pi / 180. >>> lons = np.linspace(0, 350, 18) * np.pi / 180. >>> data = np.dot(np.atleast_2d(90. - np.linspace(-80., 80., 18)).T, ... np.atleast_2d(180. - np.abs(np.linspace(0., 350., 9)))).T
Мы хотим интерполировать его на глобальную сетку с разрешением один градус
>>> new_lats = np.linspace(1, 180, 180) * np.pi / 180 >>> new_lons = np.linspace(1, 360, 360) * np.pi / 180 >>> new_lats, new_lons = np.meshgrid(new_lats, new_lons)
Нам нужно настроить объект интерполятора
>>> from scipy.interpolate import RectSphereBivariateSpline >>> lut = RectSphereBivariateSpline(lats, lons, data)
Наконец мы интерполируем данные.
RectSphereBivariateSplineобъект принимает только одномерные массивы на вход, поэтому необходимо выполнить преобразование формы.>>> data_interp = lut.ev(new_lats.ravel(), ... new_lons.ravel()).reshape((360, 180)).T
Глядя на исходные и интерполированные данные, можно увидеть, что интерполянт очень хорошо воспроизводит исходные данные:
>>> import matplotlib.pyplot as plt >>> fig = plt.figure() >>> ax1 = fig.add_subplot(211) >>> ax1.imshow(data, interpolation='nearest') >>> ax2 = fig.add_subplot(212) >>> ax2.imshow(data_interp, interpolation='nearest') >>> plt.show()
Выбор оптимального значения
sможет быть деликатной задачей. Рекомендуемые значения дляsзависят от точности значений данных. Если пользователь имеет представление о статистических ошибках в данных, она также может найти правильную оценку дляs. Предполагая, что, если она укажет правильныйs, интерполятор будет использовать сплайнf(u,v)которая точно воспроизводит функцию, лежащую в основе данных, она может вычислитьsum((r(i,j)-s(u(i),v(j)))**2)чтобы найти хорошую оценку для этогоs. Например, если она знает, что статистические ошибки в еёr(i,j)-значения не больше 0.1, она может ожидать, что хорошийsдолжно иметь значение не больше, чемu.size * v.size * (0.1)**2.Если ничего не известно о статистической ошибке в
r(i,j),sдолжен быть определён методом проб и ошибок. Лучше всего начать с очень большого значенияs(для определения полинома наименьших квадратов и соответствующей верхней границыfp0дляs) и затем постепенно уменьшать значениеs(например, в 10 раз в начале, т.е.s = fp0 / 10, fp0 / 100, ...и более тщательно (по мере того как приближение показывает больше деталей) для получения более точных соответствий.Результаты интерполяции для различных значений
sдать некоторое представление об этом процессе:>>> fig2 = plt.figure() >>> s = [3e9, 2e9, 1e9, 1e8] >>> for idx, sval in enumerate(s, 1): ... lut = RectSphereBivariateSpline(lats, lons, data, s=sval) ... data_interp = lut.ev(new_lats.ravel(), ... new_lons.ravel()).reshape((360, 180)).T ... ax = fig2.add_subplot(2, 2, idx) ... ax.imshow(data_interp, interpolation='nearest') ... ax.set_title(f"s = {sval:g}") >>> plt.show()