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