假设你有两个不同长度的数组,这样:
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
长的情况感兴趣。
一个可能的解决方案:
np.abs(b[:, None] - a).argmin(axis=1)
输出:
array([ 3, 5, 7, 8, 10, 12, 14, 16, 18, 20, 22, 24])
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])
你目前的做法,效率是 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