numpy.interp

numpy.interp(x, xp, fp, left=None, right=None, period=None)

Функция numpy.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()

interp дискретная линейная интерполяция

Возможна интерполяция функций комплексного переменного:

>>> 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])