【问题标题】:Minimum Euclidean Distance最小欧几里得距离
【发布时间】:2021-10-01 11:56:43
【问题描述】:

我有两个数据框(附图)。对于表 1 中给定的每一行 -

Part1 - 我需要在表 2 中找到给出最小欧几里得距离的行。 Output-1 是预期的答案。

Part2 - 我需要在表 2 中找到给出最小欧几里得距离的行。输出 2 是预期的答案。这里唯一的区别是Table-2中的一行不能被选择两次。

我尝试了这段代码来获取距离,但不确定如何添加其他字段 -

import numpy as np
from scipy.spatial import distance

s1 = np.array([(2,2), (3,0), (4,1)])
s2 = np.array([(1,3), (2,2),(3,0),(0,1)])
print(distance.cdist(s1,s2).min(axis=1))

两个数据帧和预期的输出:

【问题讨论】:

  • 对于第二种情况,您可能希望使用匈牙利算法。首先计算所有成对距离,然后找到最优二分匹配

标签: python dataframe numpy euclidean-distance scipy-spatial


【解决方案1】:

代码现在给出了所需的输出,并且有一个注释掉的打印语句用于额外的输出。

它还可以灵活适应不同的列表长度。

也归功于:How can the Euclidean distance be calculated with NumPy?

希望对您有所帮助:

from numpy import linalg as LA

list1 = [(2,2), (3,0), (4,1)]
list2 = [(1,3), (2,2),(3,0),(0,1)]

names = range(0, len(list1) + len(list2))
names = [chr(ord('`') + number + 1) for number in names]

i = -1
j = len(list1) #Start Table2 names
for tup1 in list1:
    collector = {} #Let's collect values for each minimum check
    j = len(list1)
    i += 1
    name1 = names[i]
    for tup2 in list2:
        name2 = names[j]
        a = numpy.array(tup1)
        b = numpy.array(tup2)
#        print ("{} | {} -->".format(name1, name2), tup1, tup2, "   ", numpy.around(LA.norm(a - b), 2))
        j += 1
        collector["{} | {}".format(name1, name2)] = numpy.around(LA.norm(a - b), 2)
        if j == len(names):
            min_key = min(collector, key=collector.get)
            print (min_key, "-->" , collector[min_key])

输出:

a | e --> 0.0
b | f --> 0.0
c | f --> 1.41

【讨论】:

  • 您能否再解释一下您正在寻找的最小值。这些都是组合,但我不太明白从哪里开始。
  • 谢谢!我正在寻找每个 list1 元素与任何列表 2 元素的最小欧几里得值。基于上述输出答案将是对 a | e , b | f , c | f
  • 有没有办法提高效率?我在每个 dfs 中有大约 100 万行
猜你喜欢
  • 2013-03-02
  • 1970-01-01
  • 2015-07-15
  • 2014-02-04
  • 1970-01-01
  • 2011-07-04
  • 2012-12-21
相关资源
最近更新 更多