比较同一列表的X Y坐标

时间:2018-08-08 06:34:38

标签: python python-3.x coordinates euclidean-distance

我有一个X Y元组坐标列表。我正在尝试使用欧式距离消除彼此非常接近的坐标。但是,到目前为止,该代码无法达到预期的效果,尤其是随着坐标数量的增加。

到目前为止,我已经在网上找到了如何比较两个坐标列表的方法,而不是同一列表中的元素的方法。 因此,我所做的就是将列表切成第一个元素,并将列表的其余部分切成薄片,然后进行欧氏距离比较。如果在邻近范围内,则将元素值从列表中删除。然后更新列表并重复该过程。但是,它没有按预期执行。

from scipy.spatial import distance

# List of coordinates.
xy = [(123, 2191), (44, 2700), (125, 2958), (41, 3368), (33, 4379), (78, 4434), (75, 5897), (50, 6220), (75, 7271), (80, 7274), (58, 8440), (60, 8440), (59, 8441), (32, 9699), (54, 9758), (58, 9759), (43, 10113), (64, 10252), (57, 12118), (61, 12120), (60, 14129), (61, 14129), (66, 15932), (68, 15933), (53, 17302), (57, 17304), (84, 20012), (84, 20013), (102, 20222), (49, 21257), (47, 21653), (56, 27042), (51, 28200), (48, 28201), (55, 28202), (65, 29366), (43, 29484), (67, 29808), (32, 30840), (31, 30842), (48, 36368), (48, 36369), (49, 36369), (21, 37518), (102, 37519)]

uni = []
for x in xy[:]:
    for i, j in enumerate(xy):
        if i == 0:
            new_xy = j # New List comprising of first element of the list
    remaining_xy = list(set(xy) - set(new_xy)) # rest of list converted into a separate list
    for m in remaining_xy:
        print(new_xy , m, distance.euclidean(new_xy , m))
        if distance.euclidean(new_xy ,m) < 1000: # If distance less then threshold, remove. 
            remaining_xy.remove(m)

    xy = remaining_xy #reset xy
    remaining_xy = [] #reset remaining_xy
    uni.append(new_xy) # append unique values. 

print(len((uni)), uni)

例如,输出显示

  

...,(53,17302),(57,17304),...

不满足阈值。

1 个答案:

答案 0 :(得分:3)

对我来说,您的代码实际上是有效的。也许只需将您的上一个打印声明更改为:

print(len(set(uni)), set(uni))

这些输出对我来说似乎是正确的。 coordinates中的所有set(uni)相距1000以上。

我得到以下信息:

  

23 {(68,15933),(58,8440),(75,7271),(51,28200),(21,37518),(61,14129),(84,20012),(65, 29366),(50、6220),(49、21257),(53、17302),(41、3368),(33、4379),(64、10252),(58、9795),(56、27042) ,(57,12118),(78,4434),(32,30840),(31,30842),(48,36369),(48,28201),(123,2191)}

更新:

不幸的是,我还没有测试完整的输出...我无法直接在您的代码中找到问题,但是使用递归函数,您将获得所需的正确结果:

def recursiveCoord(_coordinateList):
    if len(_coordinateList) > 1:
        xy_0 = _coordinateList[0]
        remaining_xy = list(set(_coordinateList) - set(xy_0))

        new_xy_list = []

        for coord in remaining_xy:
            dist = distance.euclidean(xy_0 ,coord)

            if dist >= 1000:
                new_xy_list.append(coord)

         return [xy_0] + recursiveCoord(new_xy_list)
    else:
        return []

这样称呼:

uni = recursiveCoord(xy)

,您将获得包含所有唯一坐标的列表。