У меня есть массив значений t, который всегда в возрастающем порядке (но не всегда равномерно разнесен).У меня есть еще одно значение, х.Мне нужно найти индекс в t, чтобы t [index] был ближе всего к x.Функция должна возвращать ноль для x t.max ().
Я написал две функции для этого.Первый, f1, НАМНОГО быстрее в этом простом тесте синхронизации.Но мне нравится, что вторая - всего одна строка.Это вычисление будет выполнено для большого массива, потенциально много раз в секунду.
Может кто-нибудь придумать какую-нибудь другую функцию со сравнимой по времени синхронизацией с первой, но с более чистым кодом?Как насчет чего-то быстрее первого (скорость важнее всего)?
Спасибо!
Код:
import numpy as np
import timeit
t = np.arange(10,100000) # Not always uniform, but in increasing order
x = np.random.uniform(10,100000) # Some value to find within t
def f1(t, x):
ind = np.searchsorted(t, x) # Get index to preserve order
ind = min(len(t)-1, ind) # In case x > max(t)
ind = max(1, ind) # In case x < min(t)
if x < (t[ind-1] + t[ind]) / 2.0: # Closer to the smaller number
ind = ind-1
return ind
def f2(t, x):
return np.abs(t-x).argmin()
print t, '\n', x, '\n'
print f1(t, x), '\n', f2(t, x), '\n'
print t[f1(t, x)], '\n', t[f2(t, x)], '\n'
runs = 1000
time = timeit.Timer('f1(t, x)', 'from __main__ import f1, t, x')
print round(time.timeit(runs), 6)
time = timeit.Timer('f2(t, x)', 'from __main__ import f2, t, x')
print round(time.timeit(runs), 6)