numpy.interp
numpy.interp(x, xp, fp, left=None, right=None, period=None)
Функция interp() - одномерная кусочно-линейная интерполяция функции, которая задана точками (xp, fp).
-
- x - число, массив или подобный массиву объект
- x - координаты по которым вычисляются интерполированные значения.
- xp - число, массив или подобный массиву объект
- x - координаты интерполируемых данных (интерполируемой функции).
- fp - число, массив или подобный массиву объект
- y - координаты интерполируемых данных (интерполируемой функции), той же длинны, что и
xp
. - left - число, массив или подобный массиву объект
- Значение, которое указано в данном параметре будет возвращаться для всех
x < xp[0]
(по умолчаниюleft = None
, что соответствует fp[0]). - right - число, массив или подобный массиву объект
- Значение, которое указано в данном параметре будет возвращаться для всех
x > xp[0]
(по умолчаниюleft = None
, что соответствует fp[-1]). - period - аргументы универсальной функции
- Определяет период угловых x-координат и необходим для их правильного интерполирования.
-
- результат - массив NumPy или вещественное число
- Интерполированные значения множества точек (xp, fp), размером x.
Замечание
Значения в xp
должны обязательно увеличиваться, иначе интерполяция бессмысленна. Убедиться в том, что значения в xp
увеличиваются можно с помощью команды np.all(np.diff(xp) > 0)
.
Линейная_интерполяция - ru.wikipedia.org/wiki/Линейная_интерполяция
Примеры
>>> import numpy as np
>>>
>>> xp = [5, 6, 7, 8]
>>> fp = [1, 1.5, 2, 0]
>>>
>>> # Интерполяция одной точкой:
... np.interp(6.5, xp, fp)
1.75
>>>
>>>
>>> # Интерполяция множеством точек:
... np.interp([5.5, 6.3, 6.7, 7.5], xp, fp)
array([1.25, 1.65, 1.85, 1. ])
>>>
>>>
>>> # Точки из 'x', выходящие за границы
... # 'xp', заменяются на 'fp[0]' и 'fp[-1]':
... np.interp([3, 4.8, 5.5, 6.3, 6.7, 7.5, 8.2, 9], xp, fp)
array([1. , 1. , 1.25, 1.65, 1.85, 1. , 0. , 0. ])
>>>
>>> x = [3, 4.8, 5.5, 6.3, 6.7, 7.5, 8.2, 9]
>>> np.interp(x, xp, fp, left = -11, right = 22)
array([-11. , -11. , 1.25, 1.65, 1.85, 1. , 22. , 22. ])
Суть линейной интерполяции легко отобразить на графике:
import numpy as np
import matplotlib.pyplot as plt
# Точки интерполируемой функции:
xp = np.linspace(-np.pi, np.pi, 21)
fp = np.sinc(xp)
# Вычисленные точки интерполяции:
x = np.linspace(-np.pi, np.pi, 61)
y = np.interp(x, xp, fp)
fig, ax = plt.subplots()
ax.plot(xp, fp,
marker = 'o',
label = 'sinc(x)')
ax.plot(x, y,
marker = 'x',
label = 'interp')
ax.set_title('Линейная интерполяция точек')
plt.show()
Возможна интерполяция функций комплексного переменного:
>>> xp = [5, 6, 7]
>>> fp = [1 + 1j, 1 + 2j, 2 + 1j]
>>> x = [5.5, 6.5]
>>>
>>> np.interp(x, xp, fp)
array([1. +1.5j, 1.5+1.5j])
Если x
- это угловые координаты, то для правильной интерполяции необходимо указать параметр period
:
>>> x = [30, 60, 90, 120]
>>> xp = [0, 20, 40, 60, 80, 100, 120, 140]
>>> fp = [1, 3, 4, 3, 1, 0, 1, 3]
>>>
>>> np.interp(x, xp, fp)
array([3.5, 3. , 0.5, 1. ])
>>>
>>> np.interp(x, xp, fp, period = 360)
array([3.5, 3. , 0.5, 1. ])
>>>
>>> x = [5, 15, 30, 90, 100, 110, 120, 125, 165, 180]
>>> np.interp(x, xp, fp)
array([1.5, 2.5, 3.5, 0.5, 0. , 0.5, 1. , 1.5, 3. , 3. ])
>>> np.interp(x, xp, fp, period = 360)
array([1.5 , 2.5 , 3.5 , 0.5 , 0. ,
0.5 , 1. , 1.5 , 2.77272727, 2.63636364])