在给定另一个值数组的情况下在 numpy 数组中查找最接近的值

问题描述 投票:0回答:3

假设你有两个不同长度的数组,这样:

a = np.linspace(1, 10, 25)
b = np.linspace(2, 10, 12)

我有兴趣在数组

a
中查找与数组
b
中所有值差异最小的值的索引。

执行此操作的一个简单方法(有效)是执行以下操作:

def find_nearest(a, b):
    indexes = []
    for i in range (len(b)):
        idx = (np.abs(a - b[i])).argmin()
        indexes.append(idx)
    return indexes

但是,如果

a
b
是相当长的数组,这并不是非常高效。您认为有更好的方法来写这个吗?我对数组
a
比数组
b
长的情况感兴趣。

arrays numpy optimization
3个回答
1
投票

一个可能的解决方案:

np.abs(b[:, None] - a).argmin(axis=1)

输出:

array([ 3,  5,  7,  8, 10, 12, 14, 16, 18, 20, 22, 24])

1
投票

由于您的输入值已排序,最有效的方法是使用

searchsorted
:

a = np.linspace(1, 10, 25)
b = np.linspace(2, 10, 12)

idx = np.searchsorted(a, b, side='left')

np.where(np.abs(b-a[idx]) < np.abs(b-a[idx-1]), idx, idx-1)

输出:

array([ 3,  5,  7,  8, 10, 12, 14, 16, 18, 20, 22, 24])

0
投票

你目前的做法,效率是 O(N⋅M),效率不是很高。

你可以尝试:

def find_nearest_vectorized(a, b):
   a = a[:, np.newaxis]
   diff = np.abs(a - b)
   indexes = np.argmin(diff, axis=0)
   return indexes
© www.soinside.com 2019 - 2024. All rights reserved.