在没有重复的情况下在两个数组中找到最接近

时间:2017-03-23 14:33:32

标签: python numpy

我有2个数组list1list2

list1 = np.array([1052, 1092, 1117,1135, 1156,1212,1249,1325,1363,1380,1382,1400,1484])
list2 = np.array([1053.435, 1093.698, 1118.342, 1136.697,
                  1157.832, 1212.938, 1215.741, 1250.266, 1252.352,
                  1254.453, 1256.831, 1259.182, 1326, 1367.228,
                  1400, 1410, 1740])

对于list1中的每个元素我想在list2中找到最接近的元素并返回其索引。

mylist = []
for idxlabel in range(0,len(list1)): 
    a = min(enumerate(list2), key=lambda x:abs(x[1]-list1[idxlabel]))
    print a
    mylist.append(np.copy(a))

我的问题是,list2中的一个元素被发现为"最佳匹配"我想将其从搜索中删除,以避免list1中的不同元素与list2中的相同元素匹配

(0, 1053.4349999999999)
(1, 1093.6980000000001)
(2, 1118.3420000000001)
(3, 1136.6969999999999)
(4, 1157.8320000000001)
(5, 1212.9380000000001)
(7, 1250.2660000000001)
(12, 1326.0)
(13, 1367.2280000000001)
(13, 1367.2280000000001)
(13, 1367.2280000000001)
(14, 1400.0)
(15, 1410.0)

在这个例子中,list1的第9个第10个和第11个元素与list2的第13个元素匹配,这是不可取的...

1 个答案:

答案 0 :(得分:0)

可能不是最好的方法,但您可以保留该list2数组的副本,并在每次找到匹配项时对其进行修改。像这样:

list2aux = list(list2)
mylist = []
for idxlabel in range(0,len(list1)): 
    a = min(enumerate(list2aux), key=lambda x:abs(x[1]-list1[idxlabel]))
    list2aux[a[0]] = 0
    print(a)
    mylist.append(np.copy(a))

将list2aux中的该元素更改为0将使已经选择为最佳匹配的值不再被选中。