Her zaman artan sırada (ama her zaman eşit aralıklı değil) bir dizi değer var. Başka bir tek değere sahibim, x İndeksi t [index] x'e en yakın olacak şekilde bulmam gerekiyor. Işlev x < t.min() için sıfır ve x> t.max() için maksimum dizin (veya -1) döndürmelidir.Python/Numpy - Dizini, Bir Değere En Yakın Dizide Bul Bazı Değerlere En Yakın
Bunu yapmak için iki işlev yazdım. Birincisi, f1, bu basit zamanlama testinde daha hızlıdır. Ama ikincisinin nasıl sadece bir satır olduğunu seviyorum. Bu hesaplama, potansiyel olarak saniyede birçok kez büyük bir dizi üzerinde yapılacaktır.
Herkes, bir başkasıyla karşılaştırılabilir zamanlama ile başka bir işleve gelebilir mi, ancak daha temiz görünümlü bir kodla? İlk önce daha hızlı bir şey ne dersiniz (hız en önemlisidir)?
Teşekkürler!
Kodu:
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)
bir deneyin Ikili arama. Bu sorunun cevabına bakınız: http://stackoverflow.com/questions/212358/binary-search-in-python – payne
Sadece işten ayrılıyorum, ancak daha sonra bakmak istiyorum. Bence x max (t) için test ettikten sonra kısa devre yaparak ilk fonksiyonunuzda iyileşme sağlayabileceğinizi düşünüyorum, fakat henüz test etme şansım olmadı. –