Рубрики
Без рубрики

Scipy Interpolate 1D, 2D и 3D

scipy.interpolate.interp (1d, 2d, 3d) В этой статье мы рассмотрим, как выполнять интерполяции в Python, используя Scipy Library. Scipy предоставляет много полезных функций, которые обеспечивают математическую обработку и оптимизацию анализа данных. Более конкретно, говоря о интерполяционных данных, он предоставляет некоторые полезные функции для получения быстрого и точного интерполяции, … Scipy Interpolate 1D, 2D и 3D Подробнее »

Автор оригинала: Andrea Ridolfi.

scipy.interpolate.interp(1D, 2D, 3D)

В этой статье мы рассмотрим, как выполнять интерполяции в Python, используя Scipy Library.

Scipy предоставляет много полезных функций, которые позволяют Математическая обработка и оптимизация анализа данных. Более конкретно, говоря о интерполяционных данных, он предоставляет некоторые полезные функции для получения быстрого и точного интерполяции, начиная с набора известных точек данных. В следующем тексте мы проанализируем три разных сценария интерполяции; одномерная интерполяция двух и трехмерных интерполяций.

Функции, которые будут использоваться в фрагментах кода, взяты из Scipy.interpolate Библиотека, а есть: .interp1d. () , .interp2d. () и .interpn. () , соответственно.

Что такое интерполяция?

С математической точки зрения интерполяция указывает на процесс получения значения конкретных неизвестных точек данных, которые расположены между некоторыми другими известными точками данных, после описания известного набора точек данных с подходящей функцией.

Например, если у нас есть серия точек данных x 0 , х 1 , х 2 , … x N И мы знаем ценности y 0 , y 1 , y 2 … Y N (с y n (x n )), через процесс интерполяции мы можем определить значение y м = f (x m ), где x м это точка, расположенная между двумя из уже известных точек, то есть когда x 0 м N Отказ Это можно сделать, сначала расчет функции, которая лучше всего описывает тенденцию наших известных точек данных, а затем, оценивая значение этой функции в конкретных неизвестных точках. Конечно, вся эта процедура выполняется автоматически нашим терминалом; Мы получаем только в качестве вывода значений точек, которые нас интересуют. С этим говорим, я надеюсь, что убедил вас, что интерполяция представляет собой мощный инструмент для анализа данных, для изготовления прогнозов и для многих других различных приложений.

Следующие параграфы объясняют, как выполнить интерполяцию при работе с 1, 2 или трехмерными наборами данных. Для этого мы полагаемся на Scipy библиотеку Python, более конкретно на одной из его пакетов под названием Интерполировать которые обеспечивают функцию .interp. () Для простых и немедленных способов этой задачи.

1D интерполяция

Начнем с первого импорта функции, которая будет использоваться для выполнения интерполяции.

Как уже введено, функция называется Interpolate.interp1d ( ) и принадлежит к Scipy Package. Поскольку мы будем использовать различные интерполирующие функции для каждого размера (все они принадлежащие к .interpolate ), мы просто импортируем .interpolate. из Scipy Library. Прежде всего, нам нужно создать набор данных, который будет использоваться для отображения процесса интерполяции. Мы сделаем это, определяя массив X (используя функцию numpy .linspace () ) из десяти одинаково расположенных номеров, начиная от 0 до 100. Array y, вместо этого будет определяться следующим уравнением:

import numpy as np
import matplotlib.pyplot as plt
from scipy import interpolate

#defining x and y arrays of the initial data set
x = np.linspace(0, 100,10)
y = 3*x**2 – np.exp(0.1*x)

Поскольку процесс интерполяции позволяет получить значение неизвестных точек, расположенных в пределах диапазона уже известных, мы теперь определяем другой массив X, который будет содержать больше точек, чем первый массив X («X»). В частности, мы снова эксплуатируем Отказ Linspace () построить массив из 100 одинаково расположенных номеров. Затем мы называем этот массив «X_NEW».

# x array that will be used for interpolating new point values
x_new = np.linspace(0, 100, 100)

На данный момент мы уже можем интерполировать наши исходные набор данных и получить значения новых моментов, которые мы сохранили в массиве «X_NEW». Для этого мы используем .interpolate.interp1d. () функция; который принимает в качестве обязательных входов Adrays X и Y, в которых хранятся значения известных точек данных и возвращает в качестве вывода интерполяционной функции, с которой мы можем получить значения неизвестных точек. Еще один дополнительный, но очень важный вход, который может быть указан на .interp1d. () Функция – это «вид», которая указывает тип функции, которая будет использоваться в процессе интерполяции. Есть несколько вариантов «добрых», они являются:

kind = ['linear', 'nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'previous', 'next']

Наиболее широко используемые являются «Ноль» , «Slinear» , «квадратичный» и «Кубический» С которые относятся к интерполяции стрижирования нулевого, первого, второго или третьего порядка, соответственно. «предыдущий» и «Далее» Просто верните предыдущее или следующее значение точки (см. Обратитесь к https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.interp1d.html Для полной документации на .interp1d. () ).

Для того, чтобы увидеть все эти разные интерполирующие функции, нанесенные вместе, мы можем использовать для петли и итайте процесс интерполяции и построения точек данных, как показано на фрагменте кода ниже.

kind = ['linear', 'nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'previous', 'next']
fig = plt.figure()
ax = fig.subplots()

for i in kind:
      #interpolation step
      f = interpolate.interp1d(x, y, kind = i)
      #y array that contains the interpolated data points
      y_interp = f(x_new)
     ax.plot(x_new, y_interp, alpha = 0.5, label = i)

ax.scatter(x,y)
plt.legend()
plt.show()

Как вы можете видеть в фрагменте кода, в пределах для петли мы делаем интерполяцию, позвонив функцию .interp1d. () и предоставлять в качестве входных данных массив X и Y, определенный в начале пункта; Интерполяционная функция затем назначается переменной «F». На каждом шаге итерации «вид» интерполяции изменится, выбирая вдоль различных видов, содержащихся в списке «Вид». Чтобы наконец получить значения неизвестных моментов, содержащихся в массиве «X_NEW», мы определяем массив «Y_INTERP», применяя только что рассчитанную интерполяционную функцию «F» на массив «X_NEW». Конечный результат отображается на рисунке 1.

Рисунок 1: Различные интерполирующие функции (виды). Голубые точки являются начальными известными точками данных; Как видно, через процесс интерполяции мы можем получить значения всех этих точек, расположенных между синими.

Важно подчеркнуть, что единственными известными точками, от которых мы получили все участки, показанные на рисунке 1, являются синими (десять очков). Благодаря процессу интерполяции мы получили значение всех точек, которые расположены между диапазоном этих десяти точек данных. В целом при интерполировании заданного набора данных важно получить максимально возможную информацию о распределении известных точек данных; Это помогает понять, какой «вид» интерполирующей функции даст лучшие результаты. Однако в большинстве случаев квадратичная и кубическая интерполяция – это те, которые уступают наилучшие результаты, как вы можете видеть, они наложены практически для всех точек данных.

2D интерполяция

Теперь, когда мы ввели процедуру интерполяции на одномерных наборах данных, пришло время применять одно и то же в двух измерениях. Как вы увидите, процедура очень похожа; На этот раз функция, которая будет использоваться, называется .interp2d. () .

Поскольку мы имеем дело с двумерными точками данных, чтобы построить их, нам нужно создать сетку точек, а затем назначать определенное значение для всех точек на сетке; Это будут нашими начальными, известными точками данных, от которых мы интерполизируем значения других точек данных.

Чтобы построить нашу сетку очков, мы сначала определяем массивы X и Y (называемую «X» и «Y»), используя .linspace. () ; На этот раз точки на нашей сетке будут 13 и будут варьироваться от нуля до четырех. Чтобы определить сетку из этих двух массивов, мы используем Numpy Функция .meshgrid () Отказ Следующий фрагмент кода описывает создание сетки.

x = np.linspace(0, 4, 13)
y = np.linspace(0, 4, 13)
X, Y = np.meshgrid(x, y)   

Чтобы завершить определение нашего первоначального набора точек данных, мы должны назначить определенное значение для всех пар (X, Y) точек на сетке. Для этого мы определяем новый массив называемый Z, который зависит от значений X и Y (точек сетки) и определяется следующим уравнением:

Z = np.arccos(-np.cos(2*X) * np.cos(2*Y))

Точно так же, к чему мы сделали в одномерном случае, теперь мы определяем новую и более плотную сетку, которая содержит точки, которые будут интерполированы из значения (X, Y). 65 точек этой новой сети до сих пор варьируются от 0 до четырех и хранятся в массиве «X2» и «Y2». Процесс такой же, как тот, который используется для определения первой сетки.

#denser grid of points that we want to interpolate
x2 = np.linspace(0, 4, 65)
y2 = np.linspace(0, 4, 65)
X2, Y2 = np.meshgrid(x2, y2)

Следующим шагом является интерполяция; Мы называем функцию .interp2d. () и назначить его вывод (функция интерполяции) на переменную «F». Также в двухмерном случае мы можем выбрать, какой «вид» интерполирующей функции в процессе использовать в процессе, на этот раз есть только три варианта, «линейные», «кубические» и «квантование», которые описывают тип сплайнов Используется в интерполяции (чтобы узнать больше о концепции сплайнов, пожалуйста, обратитесь к https://en.wikipedia.org/wiki/spline_(mathematics) ). Мы наконец назначаем переменную Z2, значения интерполированных точек, которые мы ранее хранимся в массивах X2 и Y2. Следующие строки кода описывают процесс интерполяции.

#interpolation
f = interpolate.interp2d(x, y, z, kind = 'cubic')
Z2 = f(x2, y2)

С помощью этого шага мы завершили 2-D интерполяцию, и мы можем отсюда быть построить результаты, чтобы иметь графическое представление о том, что было сделано функцией. Для лучшего понимания процесса интерполяции в двух измерениях мы поручим как начальную сетку 13 × 13 (слева), а 65 × 65 интерполированного (справа).

Наши участки отобразит сетки точек и будут описывать значение каждой (x, y) пары с цветовой шкалой. Для достижения такого результата мы можем эксплуатировать Функция matplotlib .pcolormesh () Что позволяет создавать псевдоцистерны с нерелярным прямоугольным сеткой ( https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.pcolormesh.html ).

#Plotting
fig = plt.figure()
ax = fig.subplots(1,2)
ax[0].pcolormesh(X, Y, Z)
ax[1].pcolormesh(X2, Y2, Z2)
plt.show()

Окончательный результат отображается на рисунке 2:

Рисунок 2: Результат .interp2d. (); Начиная с 13 × 13 сетки (слева), мы можем интерполировать значения, назначенные каждому (x, y) пару (x, y), и получить значения пары точек вдоль сетки 65 × 65 (справа).

Как видно из рисунка 2, через процесс интерполяции 2D мы укоренили первую сетку путем интерполирования значения дополнительных точек, содержащихся в диапазоне начальных точек сетки.

3D интерполяция

Мы заключаем в этой статье с последней интерполяцией, мы снова увеличиваем размеры и решая трехмерный случай. Для достижения этой задачи мы эксплуатируем функцию .interpn. (), Что можно использовать, в целом, для многомерных интерполяций на регулярных сетках (больше документирования можно найти здесь https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.interpn.html ); Это означает, что мы можем использовать эту функцию для выполнения интерполяций на данные с N Размеры, с n, которые могут быть даже выше 3.

Аналогично в другие случаи мы начинаем наш код, определяя массивы, которые будут составлять нашу 3D-сетку, на этот раз нам понадобятся три равных массива, называемые «X», «Y», «Z». Затем мы храним все их в пределах кортеж называется «очки», которые придут позже. Более того, мы определяем 3D-решетку, используя снова .мешгрид () .

#arrays constituting the 3D grid
x = np.linspace(0, 50, 50)
y = np.linspace(0, 50, 50)
z = np.linspace(0, 50, 50)
points = (x, y, z)
#generate a 3D grid
X, Y, Z = np.meshgrid(x, y, z)

На данные моменты мы должны назначить ценность для всех тройных моментов (x, y, z) точек на сетке; Для этого мы определяем функцию «func_3d (x, y, z)”, которая для определенного набора значений X, Y и Z возвращает выражение:

Как видите, функция зависит от трех независимых переменных. Значения всех тройных (x, y, z) будут сохранены в массиве “Значения”, определяют, вызывая функцию «Func_3D» на всех точках X, Y, Z.

#evaluate the function on the points of the grid
values = func_3d(X, Y, Z) 

Поскольку было бы невозможно построить созданную сетку (это приведет к четверомерному участку); Мы просто определяем массив, содержащий тройки точек, которые мы хотим интерполировать в виде списков. В нашем случае мы будем выполнять интерполяцию только на одном тройке, определенном в массиве «точка».

point = np.array([2.5, 3.5, 1.5]) 

Теперь мы называем .interpn. () функция для выполнения интерполяции. По-разному из предыдущих двух функций .interpn. () Не имеет опции «Вид», но вместо этого представляет собой тот, который называется «метод»; Значение по умолчанию «линейно». Входы этой функции являются кортеж, содержащий все три массивы, которые составляли начальную 3D-сетку (а именно «X», «Y» и «z», хранятся в кортежных «точках»), значения, назначенные каждому тройку ( хранится в массиве «значения») и массивом, содержащем координаты точек, в которых мы хотим выполнить интерполяцию (в нашем случае, только одна точка, координаты которых хранятся в «точке»). Мы включаем все это в команду «Печать», чтобы напрямую получить результат интерполяции:

# points = the regular grid, #values =the data on the regular grid
# point = the point that we want to evaluate in the 3D grid
print(interpolate.interpn(points, values, point))

Окончательный результат составляет 13,0; Это интерполированное значение для точки координат (2,5, 3,5, 1,5).