快速查找数组中最接近某个值的索引
我有一个值数组 t,它始终按递增顺序排列(但并不总是均匀间隔)。我还有另一个单一值 x。我需要找到 t 中的索引,使得 t[index] 最接近 x。当 x < 时,该函数必须返回零。 t.min() 和 x > 的最大索引(或 -1) 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)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这看起来更快(对我来说,Python 3.2-win32,numpy 1.6.0):
输出:
This seems much quicker (for me, Python 3.2-win32, numpy 1.6.0):
Output:
np.searchsorted
是二分搜索(每次将数组分成两半)。因此,您必须以返回小于 x 的最后一个值而不是返回零的方式来实现它。看看这个算法(来自这里):
刚刚替换了最后一行(是
返回-1
)。还改变了论点。由于循环是用 Python 编写的,它可能比第一个慢......(未进行基准测试)
np.searchsorted
is binary search (split the array in half each time). So you have to implement it in a way it return the last value smaller than x instead of returning zero.Look at this algorithm (from here):
just replaced the last line (was
return -1
). Also changed the arguments.As the loops are written in Python, it may be slower than the first one... (Not benchmarked)
使用 searchsorted:
编辑:
啊,是的,我明白你在 f1 中就是这么做的。也许下面的 f3 比 f1 更容易阅读。
Use searchsorted:
Edit:
Ah yes, I see that's what you do in f1. Maybe f3 below is easier to read than f1.