Skip to main content
 首页 » 编程设计

python之在两个 numpy 数组中查找最接近的值

2025年05月04日8lvdongjie

这里的目标是速度——我试图避免在有问题的数组中循环。然而,可以假定这两个数组已排序。

a = np.arange(10) 
b = np.array([2.3, 3.5, 5.8, 13]) 
c = somefunc(a,b) 

现在 somefunc 应该找到 a 的索引,b 中的值也与其最接近,即

In []: c 
Out[]: array([2, 3or4, 6, 9])  #3 or 4 depending on python2 or 3 

再一次,这可以通过循环来完成,但我正在寻找更快的方法。我通过采用绝对差异类型的方法非常接近,例如:

np.argmin(np.abs(a[:, np.newaxis] - b), axis=0) 

但即使这样也有点慢,因为做了很多不必要的减法。

请您参考如下方法:

因此使用@Eelco 的建议使用 searchsorted,我得出以下结果,它在更大的数据集上比矢量方法上的 np.argmin 更快:

def finder(a, b): 
    dup = np.searchsorted(a, b) 
    uni = np.unique(dup) 
    uni = uni[uni < a.shape[0]] 
    ret_b = np.zeros(uni.shape[0]) 
    for idx, val in enumerate(uni): 
        bw = np.argmin(np.abs(a[val]-b[dup == val])) 
        tt = dup == val 
        ret_b[idx] = np.where(tt == True)[0][bw] 
    return np.column_stack((uni, ret_b))