我有一个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),...
不满足阈值。
答案 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)
,您将获得包含所有唯一坐标的列表。