列表内列表之间的欧几里得距离

Posted

技术标签:

【中文标题】列表内列表之间的欧几里得距离【英文标题】:eucledian distance between lists inside a list 【发布时间】:2019-09-22 08:57:54 【问题描述】:

我想计算列表中列表之间的欧几里德距离,以及该距离是否小于阈值,而不是获取此类列表的最大元素。

我的解决方案为我提供了每两个列表之间的距离,但我想将每个列表相互比较。基本上,可能是两个循环解决方案。

yhat = [[10 , 15, 200 ,220], [20 , 25, 200 ,230], [30 , 15, 200 ,230], [100 , 150, 230 ,300], [110 , 150, 240 ,300] ]

def euclidean(v1, v2):
    return sum((p-q)**2 for p, q in zip(v1, v2)) ** .5

it = iter(yhat)
prev = next(it)
ec =[]
for ind, ele in enumerate(it):
    ec.append(euclidean(ele, prev))
    prev = ele
ec

总而言之,我想要一个包含元素的新列表xhat

xhat = [[30 , 35, 200 ,230], [110 , 150, 240 ,300] ]

【问题讨论】:

【参考方案1】:

您可以使用enumerateitertools.combinations 来缩短:

from itertools import combinations

out = defaultdict(lambda: defaultdict(dict))
for (i, v1), (j, v2) in combinations(enumerate(yhat), 2):
    out.setdefault(i, )[j] = euclidean(v1, v2)

out
0: 1: 17.320508075688775, 2: 22.360679774997898, 3: 183.3712082089225, 4: 190.3286631067428, 
 1: 2: 14.142135623730951, 3: 166.80827317612278, 4: 173.8533865071371, 
 2: 3: 170.07351351694948, 4: 176.4227876437735, 
 3: 4: 14.142135623730951

其中 out 映射到输入列表中的索引到这些索引处的向量之间的距离。 您可以获得距离小于阈值的向量的最大元素,例如:

for (i, v1), (j, v2) in combinations(enumerate(yhat), 2):
    if euclidean(v1, v2) < threshold:
        out.setdefault(i, )[j] = (max(v1), max(v2))
out
0: 1: (220, 230), 2: (220, 230), 3: (220, 300), 4: (220, 300), 
 1: 2: (230, 230), 3: (230, 300), 4: (230, 300), 
 2: 3: (230, 300), 4: (230, 300), 
 3: 4: (300, 300)

【讨论】:

好的,非常感谢。以及如何将这些索引映射到列表元素,并计算每个列表的最大项目......它有点复杂:(

以上是关于列表内列表之间的欧几里得距离的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 numpy 或 zip 的情况下找到两个列表之间的欧几里得距离?

从点列表中成对欧几里德距离

识别差异的最佳方法:欧几里得距离、余弦距离还是简单减法?

如果两个列表超过给定的欧几里德距离,如何从两个列表中删除特定值?

使用构造函数计算两点之间的欧几里得距离

Pyspark上两点之间的欧几里得距离