比较同一列表的 X Y 坐标
Comparing X Y coordinates of the same list
我有一个 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), ...
不满足阈值。
对我来说,您的代码确实有效。也许只需将您最后的打印语句更改为:
print(len(set(uni)), set(uni))
这些输出似乎适合我。 set(uni)
中的所有coordinates
都相距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, 9759), (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)
你会得到一个包含所有唯一坐标的列表。
我有一个 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), ...
不满足阈值。
对我来说,您的代码确实有效。也许只需将您最后的打印语句更改为:
print(len(set(uni)), set(uni))
这些输出似乎适合我。 set(uni)
中的所有coordinates
都相距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, 9759), (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)
你会得到一个包含所有唯一坐标的列表。