比较两个元组列表的欧几里德距离与较少的比较python

2024-03-29 09:26:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图计算阈值为4的两个元组列表的欧几里德距离。如果阈值小于特定值,则递增计数器。每个元组是点的x,y,z坐标。不管怎样,我能把列表1和列表2的比较降低一点吗。。在

  X = [ (1,2,3),(2,3,4), (4,5,6) ]
  Y = [ (1,2,2) , (3,4,5),(6,7,8) ]
  from math import sqrt
  dist_X = [ sqrt((p[0] - 0)**2 + (p[1] - 0)**2 + (p[2] - 0)**2) for p in X]
  dist_Y = [ sqrt((p[0] - 0)**2 + (p[1] - 0)**2 + (p[2] - 0)**2) for p in Y]
  for x in dist_X:
     print (x ,  [ i for i,y in enumerate(dist_Y) if abs(x-y) <= 4])

我想先计算原点(0,0,0)上每个点的欧几里德距离,这样两个列表现在都包含了彼此接近的点,但它不起作用,因为它是一个标量值。。我走的方向对吗?在

编辑

^{pr2}$

在这里,列表1的每个元素都与列表2中的每个元素进行比较。。我想知道是否有一种方法可以最大限度地减少比较给定的点(x,y,z)?在


Tags: infromimport元素距离列表fordist
2条回答

一种有时可以加快速度的预计算是kd-trees。我运行了一个针对暴力的快速测试,发现对于更大的列表,它们可以更快一些:

# n = 10
# trees                 0.08512560 ms
# brute                 0.01425540 ms
# n = 100
# trees                 0.20338160 ms
# brute                 0.09876890 ms
# n = 1000
# trees                 6.40193820 ms
# brute                16.15429670 ms
# n = 10000
# trees               298.69653380 ms
# brute              1393.71134270 ms

代码:

^{pr2}$

把这个画出来看看它看起来怎么样。与原点的距离大致相同的点是,它们之间必须很接近,这里有三角形不等式。例如,比较点(0,10),(0,11)和(-8,-6)。他们都是10-11个单位的来源,但最后一个单位远不及其他两个单位。在

如果你想知道两个点是否彼此靠近,你需要计算这两个点之间的距离,而不是到任意第三个点的距离。这个问题的复杂性是二次的,而不是线性的。在

相关问题 更多 >