上图是具有填充像素(约2,000 x 2,000像素,填充约30%)的图像部分的简化表示。
在“ filledPixels”的KDTree上使用query_ball_point(成本为x),用黄色突出显示的像素是将要返回的像素(在这种情况下)。
但是,黑线表示我实际上要查询的“象限”(我的用语,所以可能不是正确的技术术语)。
在这种情况下,我希望得到第1象限内的结果(即,从我的源得出的右上角的任何象限),第2象限将是右下角,左下角,左上角。请注意,在此示例中,公差为x = 2 y = 2。
我并没有尝试将每个填充的像素分类为一个象限,所以象限会重叠(由于公差)并不重要-它们仅与定义每个查询中我想要的结果范围有关
def queryFunction(source_coord, cost, quadrant):
resultsIDX = MapTreeFilledPixels.query_ball_point([coord[0], coord[1]], r=cost)
filteredResultsInCoords = []
for result in resultsIDX:
if quadrant == 1:
if filledPixels[result][0]>=source_coord[0]-x_tolerance and filledPixels[result][1]<=source_coord[1]+y_tolerance:
filteredResultsInCoords.append(filledPixels[result], calculateDistanceBetween(source_coord,filledPixels[result]))
elif quadrant == 2:
....
return sorted(filteredResultsInCoords, key=lambda tup: tup[1])
我想返回坐标和成本的列表,按成本排序。
我正在运行1,000个查询(在同一数据源上,但是参数source_coord,cost和象限发生了变化),并且我试图减少每个查询的时间(一次性的“设置”时间,即构建KDtree-或其他方法没有那么重要)
有什么方法可以改善每次查询时间吗?例如,我可以对查询应用过滤器/掩码吗? (每次查询重建数据源可能效率不高),还是只根据成本查询结果,然后根据相对位置丢弃结果?如果是这样,那么这样的代码是最有效的方法吗?
(请注意,我必须使用单独的函数来计算距离,因为查询结果中似乎没有这个距离)
我很高兴我没有基准数据来支持这一点(分析显示大约60%的时间在该区域内,这给我造成了问题),但是我希望有人比我自己有更多知识可以建议我使用的是错误的工具,还是做的效率明显低下。