回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有一个值数组,t,它总是以递增的顺序排列(但不总是等距排列)。我有另一个值x。我需要在t中找到索引,使t[索引]最接近x。函数必须返回0(x<;t.min())和最大索引(或-1)(x>;t.max())。</p>
<p>我写了两个函数来做这个。第一个,f1,在这个简单的计时测试中要快得多。但我喜欢第二条线只是一条线。此计算将在一个大数组上完成,可能每秒多次。</p>
<p>有谁能想出一些其他的功能,与第一个类似的时间,但与更干净的代码?不如先快一点(速度是最重要的)怎么样?</p>
<p>谢谢!</p>
<p>代码:</p>
<pre><code>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)
</code></pre>