查找两个列表中最接近的元素 - 最好的方法

Rom*_*min 0 python numpy

我有两个数值列表(或数据框列 - 无关紧要):

L1 = [1, 0.5, 3, 7, 4.7]
L2 = [2, 0.4, 8, 0.3, 5]
Run Code Online (Sandbox Code Playgroud)

例如。我需要关联这些列表并找到与(indexOfElementFromL1, indexOfElementFromL2)两个元素的最小差异相对应的对。例如,对于我的示例,它应该是: (0,1), (1,1), (2,0), (3,2), (4,4).真正是我想要的 - 找到与 L1 中的每个元素最接近的元素 L2。当然,我可以采用天真的方法,例如:

for el1 in L1:
  for el2 in L2:
    ....
Run Code Online (Sandbox Code Playgroud)

但我想看到更正确的解决方案

小智 5

您可以通过将列表转换为 numpy 数组并使用 numpy 广播来快速完成此操作:

a1 = np.array(L1)
a2 = np.array(L2)

indexes = abs(a1[:, None] - a2).argmin(axis=1)
out = list(enumerate(indexes))
Run Code Online (Sandbox Code Playgroud)

输出:

>>> indexes
array([1, 1, 0, 2, 4])

>>> out
[(0, 1), (1, 1), (2, 0), (3, 2), (4, 4)]
Run Code Online (Sandbox Code Playgroud)