2015-03-02 2 views
7

Я хочу, чтобы интерполировать Numpy массива, и np.interp делает почти то, что я хочу:NumPy интерполяции уменьшая хра

interp(x, xp, fp, left=None, right=None) 
One-dimensional linear interpolation. 

для этого бита исключения:

не проверяет, что x-координатная последовательность xp увеличивается. Если xp не увеличивается, результаты являются нонсенсом.

Мой хр уменьшается, так что лучше: Изменение направления как хр FP:

np.interp(x, xp[::-1], fp[::-1]) 

или инвертирования х и хр:

np.interp(-x, -xp, fp) 

Или есть еще лучше?

+0

Любая разница в результатах? – hpaulj

+0

@hpaulj Не то, что я вижу. – chw21

+0

Я думаю, что первый из них может быть лучше, потому что в процессе не будет создан массив temp. – Kattern

ответ

4

Спасибо за всех тех, кто дал свой вклад, особенно @Jaime.

Я экспериментировал немного, и пришел к такому выводу:

1) Помимо ошибок округления, оба метода, упомянутого мною имеет один и тот же результат.

2) Они оба занимают очень много одинаковое количество времени

3) Я попробовал SciPy версию, но она отвергает assume_sorted флаг. Возможно, моя версия scipy устарела. Я подозреваю, что если этот флаг поднят, scipy внутренне сортирует массивы. Но значения сортируются, как раз в противоположном направлении, так что это не нужно делать.

Во всяком случае, я буду использовать метод обратного направления:

np.interp(x, xp[::-1], fp[::-1]) 

Просто помните, что в этом случае, вы также должны обратить left и right, если вы нуждаетесь в них.

+0

Это решение не учитывает оба случая упорядоченных и не упорядоченных значений х. Параметр accept_sorted в функции interpolate.interp1d должен работать на вас. – hakanc

+0

В соответствии с вопросом, в моем случае значения x упорядочены, только в порядке убывания.И нет, опция 'accept_sorted = False' не работала для меня, потому что моя версия' scipy' слишком старая. – chw21

3

Если у вас есть доступ к Scipy, вы можете использовать функцию interp1d, у которой есть ключевое слово assume_sorted=False, чтобы обрабатывать уменьшающиеся массивы.

Редактировать: Это решение обрабатывает как случаи упорядоченных, так и не упорядоченных значений х.

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

# Decreasing array 
x = np.arange(0, 10)[::-1] 
y = np.exp(-x/3.0) 

# Interpolation object 
f = interpolate.interp1d(x, y, assume_sorted = False) 

xnew = np.arange(3,5) 
ynew = f(xnew) # use interpolation function returned by `interp1d` 
plt.plot(x, y, 'o', xnew, ynew, '-') 
plt.show()