难以从 class 个实例列表构建二叉树

Having difficulty constructing a Binary tree from a list of class instances

我正在尝试构建用于查找 'K nearest neighbour' 的 KDtree 我创建了一个名为 'Point' 的 class,它包含以下属性:pointID、lat(纬度)和 Lon(经度)。 build_index 的输入是一个数组 'points' 包含点的所有实例。

在下面的代码中,我试图构建 KDtree,但我在尝试仅检索要排序的每个点的纬度和经度时遇到问题,但我知道仅使用 'points' 不会工作,因为它是一个只有 class 个实例的数组。

提前感谢您的帮助!

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:])
       }



point[axis] 不起作用,因为 point 不支持这种括号表示法。

有几种解决方法:

  1. Point 定义为命名元组:

    而不是将 Point 定义为:

    class Point:
        def __init__(self, pointID, lat, lon):
            self.pointID = pointID
            self.lat = lat
            self.lon = lon
    

    ...将其定义为命名元组。确保 lonlat 成为它的前两个成员:

    Point = namedtuple("Point", "lat,lon,pointID")
    

    还要确保我们创建了 Point 个实例,您将参数按正确的顺序排列。

    有了这个改变,它就会起作用。这要求您将 Point 个实例视为不可变的。

  2. 根据字符串变量访问属性(lonlat):

    axis = ("lon", "lat")[depth % 2]
    sorted_points = sorted(points, key = lambda point: getattr(point, axis))