这个答案解释了如何高效地找到(排序后的)数组中离一个单一点最近的元素,适用于大型数组(稍作修改):
def arg_nearest(array, value):
idx = np.searchsorted(array, value, side="left")
if idx > 0 and (idx == len(array) or math.fabs(value - array[idx-1]) < math.fabs(value - array[idx])):
return idx-1
else:
return idx
如果我们想要找到离一个点集(即第二个数组)最近的数组元素,除了使用for循环,是否有更高效(对于大型数组而言)的方法来扩展这个问题?
一些测试案例:
>>> xx = [0.2, 0.8, 1.3, 1.5, 2.0, 3.1, 3.8, 3.9, 4.5, 5.1, 5.5]
>>> yy = [1, 2, 3, 4, 5]
>>> of_x_nearest_y(xx, yy)
[0.5, 2.0, 3.1, 3.9, 5.1]
>>> xx = [0.2, 0.8, 1.3, 1.5, 2.0, 3.1, 3.8, 3.9, 4.5, 5.1, 5.5]
>>> yy = [-2, -1, 4.6, 5.8]
>>> of_x_nearest_y(xx, yy)
[0.2, 0.2, 4.5, 5.5]
编辑:假设两个数组已经排序,你可以通过排除已匹配的值来比完全幼稚的for循环更好地处理它们,即:
def args_nearest(options, targets):
locs = np.zeros(targets.size, dtype=int)
prev = 0
for ii, tt in enumerate(targets):
locs[ii] = prev + arg_nearest(options[prev:], tt)
prev = locs[ii]
return locs
searchsorted
接受一个值数组进行搜索,因此修改arg_nearest
以适应您的工作并不太困难。 - user2357112