我有一些坐标,每个坐标都有相应的标签,就像这样:
[((22, 108), 'A'), ((24, -57), 'A'), ((32, -141), 'B')]
在我的任务中,我需要更改坐标值(例如,笛卡尔坐标为极坐标)并对它们重新排序(例如,theta 的升序),同时保留它们的标签。 我应该使用什么类别的变量?
在一张图像中,我有 16 组笛卡尔坐标,每组都有相应的标签,如下所示:
[((122, 400), 'A'), ((135, 354), 'A'), ((79, 328), 'A'), ((192, 326), 'A'), ((85, 280), 'A'), ((131, 272), 'A'), ((91, 365), 'B'), ((170, 361), 'B'), ((49, 298), 'B'), ((207, 287), 'B'), ((168, 274), 'B'), ((160, 403), 'C'), ((198, 398), 'C'), ((213, 363), 'C'), ((155, 313), 'C'), ((117, 313), 'C')]
我的工作是对坐标进行排序,以便最终得到 16 个字母的数组。
这些坐标映射图像中的两个粗略圆,外部有 12 组坐标,内部有 4 组坐标。
为了将它们分类,我不能直接使用 X 或/和 Y,因为有些集合彼此太接近,在未来的图像中它们可以交换位置。
因此,我将质心设为点 (0, 0),并将坐标从笛卡尔 (x,y) 更改为极坐标 (r, theta)。知道我总是有 4 个点比其他点更接近 (0, 0),所以我按“r”的升序对它们进行排序,并将它们分成 2 个数组,然后按“theta”的升序对两个数组进行排序,像这样:
outer_coords = sorted(coords[4:], key=lambda th: th[1])
inner_coords = sorted(coords[:4], key=lambda th: th[1])
剩下需要知道的是每个坐标代表什么标签,它们应该总是成对的并且永远不会分开。
提前谢谢您。
sorted_indices = sorted(range(len(coordinates)), key=lambda i: (coordinates[i][0], coordinates[i][1], labels[i]))
sorted_zipped_variable = [(coordinates[i], labels[i]) for i in sorted_indices]
我建议将标记点封装在对象中,而不是使用通用的元组容器。然后您可以更轻松地定义函数来提供排序键。
结果看起来像这样
import math
class LabeledPoint:
def __init__(self, coord, label):
self.coord = coord
self.label = label
def theta_from(self, center):
(x0, y0) = center
(x, y) = self.coord
return math.atan((x - x0) / (y - y0))
points = [LabeledPoint(coord, label) for (coord, label) in data]
center = compute_center(points)
points.sort(key=lambda p: p.theta_from(center))
print(''.join(point.label for point in points))