Я пишу сплайновый класс в Python. Для вычисления интерполированного значения сплайна требуется индекс ближайших точек данных x. В настоящее время упрощенная версия выглядит следующим образом:Эффективный способ поиска индекса интервала
def evaluate(x):
for ii in range(N): # N = len(x_data)
if x_data[ii] <= x <= x_data[ii+1]:
return calc(x,ii)
Так перебирает список x_data
точек, пока он не найдет более низкий индекс ii
интервала, в которых x
ложь и использует в функции calc
, которая выполняет сплайн-интерполяции , В то время как функциональный, похоже, что это было бы неэффективно для больших массивов x_data
, если x
близко к концу набора данных. Есть ли более эффективный или элегантный способ выполнения той же функциональности, которая не требует, чтобы каждый интервал был проверен итеративно?
Примечание: x_data
можно считать сортированным таким образом x_data[ii] < x_data[ii+1]
, но не обязательно равномерно распределенным.
Это заказ O (log n), фактически. И я просто посмотрел на исходный код для 'bisect()': это двоичный поиск. –
Я не думаю, что это работает. 'bisect ([0,1,2], 0,1])' дает 1, а не 0, поэтому сравнение значений в 'index' и' index + 1' будет смотреть на '[1,2]', а не '[ 0,1] '. – DSM
@DSM, потому что bisect ищет точку вставки для x, так что x_data остается в отсортированном порядке, просто вычтите 1 для результата и исправьте негативы, и это должно сделать трюк – Copperfield