查找数组一中最接近数组二的元素

2023-12-09

这个答案解释如何找到最接近(已排序)的数组元素单点,以对大型数组有效的方式(稍作修改):

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

相反,如果我们想找到最接近 a 的数组元素set点(即第二个数组);除了使用 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]

编辑:假设两个数组都已排序,您可以执行以下操作little比一个更好完全地通过排除低于已匹配值的值来进行天真的 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

您可以进行一些更改来扩展它的元素数组value,就像这样-

idx = np.searchsorted(xx, yy, side="left").clip(max=xx.size-1)
mask = (idx > 0) &  \
       ( (idx == len(xx)) | (np.fabs(yy - xx[idx-1]) < np.fabs(yy - xx[idx])) )
out = xx[idx-mask]

解释

命名法:array是我们要在其中放置元素的数组value保持排序的性质array.

将单个元素的解决方案扩展到多个元素以进行搜索所需的更改:

1]剪辑索引数组idx从...获取np.searchsorted最多的array.size-1,因为对于中的元素value大于最大值array,我们需要使idx可索引的array.

2]介绍numpy取代math以矢量化方式执行这些操作。

3]用以下技巧替换条件语句idx - mask。在这种情况下,Python 会在内部进行上转换mask to an int数组与数据类型匹配idx。因此,所有的True元素变成1因此对于True我们将有效拥有的要素idx-1, 哪一个是True原始代码中 IF 条件语句的情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查找数组一中最接近数组二的元素 的相关文章

随机推荐