我有值,T的陣列,即總是遞增次序(但不總是均勻間隔的)。我還有另一個值x。我需要在t中找到索引,使得t [index]最接近x。該函數必須爲x < t.min()返回零,併爲x> t.max()返回最大索引(或-1)。的Python/numpy的 - 快速查找索引數組中的最近的某個值
我已經寫了兩個函數來做到這一點。第一個,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)
由於您的數組進行排序,嘗試二進制搜索。看到這個問題的答案︰http://stackoverflow.com/questions/212358/binary-search-in-python – payne 2011-05-19 23:04:38
我只是離開工作,但想看看這個稍後。我認爲,一旦你測試了x max(t),你可能會通過短路改善你的第一個功能,但我還沒有機會測試它。 –
2011-05-19 23:05:51