我应该使用什么Python类来解决我的问题?

问题描述 投票:0回答:1

简短说明:

我有一些坐标,每个坐标都有相应的标签,就像这样:

[((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])

剩下需要知道的是每个坐标代表什么标签,它们应该总是成对的并且永远不会分开。

提前谢谢您。

  1. 我尝试了 zip() 但它不可下标,因此很难单独处理坐标。
  2. 我想过永远不要更改 zip 的坐标,并对索引进行排序,然后使用排序后的索引对压缩变量重新排序:
    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]
python class image-processing variable-assignment
1个回答
0
投票

我建议将标记点封装在对象中,而不是使用通用的元组容器。然后您可以更轻松地定义函数来提供排序键。

结果看起来像这样

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))
© www.soinside.com 2019 - 2024. All rights reserved.