#python #algorithm #oop #binary-tree
Вопрос:
Я пытаюсь построить дерево KD для поиска «ближайшего соседа K». Я создал класс под названием «Точка», который содержит атрибуты: pointID, широта (широта) и долгота (долгота). входными данными для build_index является массив «точки», содержащий все экземпляры точек.
в приведенном ниже коде я пытаюсь построить дерево KD, но у меня возникают проблемы с попытками извлечь только lat и Lon каждой точки для сортировки, но я понимаю, что простое использование «точек» не будет работать, так как это массив только с экземплярами классов.
заранее спасибо за помощь!
class KDTreeNN(NearestNeigh):
def build_index(self, points: [Point]):
depth = 0
n = len(points)
if n <0:
return None
axis = depth % 2
sorted_points = sorted(points, key = lambda point: point[axis])
depth 1
return {
'point' : sorted_points[int(n/2)],
'left' : self.build_index(sorted_points[:int(n/2)]),
'right' : self.build_index(sorted_points[int(n/2) 1:])
}
Ответ №1:
point[axis]
не работает, потому point
что не поддерживает такую скобочную нотацию.
Существует несколько решений:
- Определить
Point
как именованный кортеж:Вместо того, чтобы определять
Point
как что-то вроде:class Point: def __init__(self, pointID, lat, lon): self.pointID = pointID self.lat = lat self.lon = lon
…определите его как именованный кортеж. Убедитесь, что сделали
lon
иlat
его первые два участника:Point = namedtuple("Point", "lat,lon,pointID")
Также убедитесь, что при создании
Point
экземпляров вы расположили аргументы в правильном порядке.С этим изменением это сработает. Это требует, чтобы вы рассматривали
Point
экземпляры как неизменяемые. - Доступ к атрибуту (
lon
илиlat
) в зависимости от строковой переменной:axis = ("lon", "lat")[depth % 2] sorted_points = sorted(points, key = lambda point: getattr(point, axis))