难以从 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
不支持这种括号表示法。
有几种解决方法:
将 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))
我正在尝试构建用于查找 '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
不支持这种括号表示法。
有几种解决方法:
将
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))