【发布时间】:2019-02-01 22:14:22
【问题描述】:
我正在尝试根据条件从列表列表中删除列表。例如,pnts 是使用 P1、P2、P3、P4 和 P5 等列表形成的列表列表。这些 P1、P2、P3、P4 和 P5 代表空间中的一个点位置。我想删除彼此非常接近的点,例如 P4 和 P5。由于 P4 和 P5 非常接近 P1 并且仅在新列表中保留它们的第一次出现。使用下面给出的完整代码函数“is_equal”检查每个点的接近度。
P1 = [3.333, 0.000, 0.000]
P2 = [0.000, 0.000, 0.000]
P3 = [10.000, 0.000, 0.000]
P4 = [3.333, 0.000, 0.000]
P5 = [3.3, 0.000, 0.000]
pnts = [P1, P2, P3, P4, P5]
如果两点之间测量的距离接近于零,则应从列表中删除第二个重复点。
所以答案应该是,
pnts = [P1, P2, P3]
完整代码如下,
import math
import collections
import itertools
def is_equal(grid1, grid2):
L = math.sqrt((grid1[0]-grid2[0])**2 + (grid1[1]-grid2[1])**2 + (grid1[2]-grid2[2])**2)
if round(L)==0:
return True
else:
return False
P1 = [3.333, 0.000, 0.000]
P2 = [0.000, 0.000, 0.000]
P3 = [10.000, 0.000, 0.000]
P4 = [3.333, 0.000, 0.000]
P5 = [3.3, 0.000, 0.000]
pnts = [P1, P2, P3, P4, P5]
我尝试过使用itertools groupby 函数但我无法得到正确答案,即
list(pnts for pnts,_ in itertools.groupby(pnts))
谁能提出一个更好的方法来处理这种重复的点删除?
【问题讨论】:
-
我认为您最好使用 numpy,并从 ndarray 构建欧几里德距离矩阵
-
感谢您的建议。那么让我尝试用 numpy 来做吧。
-
您能详细说明一下最终目标吗?根据您最终要实现的目标,可以使用层次聚类或 DBSCAN,以防您希望得到特定数量的点或具有被认为不同点的最小距离。
标签: python python-3.x list collections itertools