Почему Matlab interp1 дает результаты, отличные от nupy interp? - PullRequest
1 голос
/ 08 мая 2019

РЕДАКТИРОВАТЬ: Код отредактирован для получения результатов в соответствии с Matlab.См. Ниже.

Я конвертирую скрипты Matlab в Python, и результаты линейной интерполяции в некоторых случаях различны.Интересно, почему и если есть какой-нибудь способ исправить это?

Вот пример кода и в Matlab, и в Python и полученный результат (обратите внимание, что в этом случае t просто так совпадает с tin):

MATLAB:

t= [ 736696., 736696.00208333, 736696.00416667, 736696.00625, 736696.00833333, 736696.01041667, 736696.0125];
tin =[ 736696., 736696.00208333, 736696.00416667, 736696.00625, 736696.00833333, 736696.01041667,  736696.0125];
xin = [   nan , 1392.,  1406. , 1418.  ,  nan , 1442. ,   nan];

interp1(tin,xin,t)

ans =

 NaN        1392        1406        1418         NaN        1442         NaN

Python (numpy) :

(scipy interpolate.interp1d выдает тот же результат, что иNumPy)

t= [ 736696., 736696.00208333, 736696.00416667, 736696.00625, 736696.00833333, 736696.01041667, 736696.0125];
tin =[ 736696., 736696.00208333, 736696.00416667, 736696.00625, 736696.00833333, 736696.01041667,  736696.0125];
xin = [   nan , 1392.,  1406. , 1418.  ,  nan , 1442. ,   nan];

x = np.interp(t,tin,xin)

array([   nan,  1392.,  1406.,    nan,    nan,    nan,    nan]) 

# Edit
# Find indices where t == tin and if the np.interp output 
# does not match the xin array, overwrite the np.interp output at those 
# indices 
same = np.where(t == tin)[0]
not_same = np.where(xin[same] != x[same])[0]
x[not_same] = xin[not_same]

1 Ответ

1 голос
/ 09 мая 2019

Похоже, что Matlab включает дополнительную проверку равенства в своей интерполяции.

Линейная 1-D интерполяция обычно выполняется путем нахождения двух значений x, которые охватывают входное значение x, а затем вычисление результата как:

y = y1 + (y2-y1)*(x-x1)/(x2-x1)

Если вы передадите значение x, которое точно равно одной из входных координат x, процедура, как правило, вычислит правильное значение, поскольку x-x1 будетбыть ноль.Однако, если ваш входной массив имеет nan как y1 или y2, они будут распространяться на результат.

Исходя из кода, который вы разместили, я думаю, что функция интерполяции Matlab имеетдополнительная проверка, которая выглядит примерно так:

if x == x1:
    return y1

и что функция numpy не имеет этой проверки.

Чтобы добиться того же эффекта в numpy, вы можете сделать:

np.where(t == tin,xin,np.interp(t,tin,xin))
...