Могу ли я применить фильтр к запросам KDTree.query_ball_tree (пытаясь ускорить запросы) - PullRequest
0 голосов
/ 07 января 2019

enter image description here

Выше приведено упрощенное представление части изображения с заполненными пикселями (приблизительно 2000 x 2000 пикселей, с заполненными приблизительно 30%).

При использовании query_ball_point на KDTree для «fillPixels» со стоимостью 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])

Я хочу вернуть список координат и стоимости, отсортированный по стоимости.

Я выполняю 1000 запросов (в том же источнике данных, но меняются параметры source_coord, стоимость и квадрант), и я пытаюсь сократить время на запрос (разовое время «настройки», т.е. KDtree - или альтернативный подход не так важен)

Можно ли как-нибудь улучшить свой показатель за время запроса? Например, я могу применить фильтр / маску к моему запросу? (восстановление источника данных по запросу, вероятно, неэффективно), или я запрашиваю результаты, основанные только на стоимости, а затем отбрасываю их на основе относительной позиции? И если да, то является ли такой код наиболее эффективным способом сделать это?

(ПРИМЕЧАНИЕ. Мне нужно рассчитать расстояние с помощью отдельной функции, так как в результатах запроса этого нет)

Я ценю, что у меня нет контрольных показателей, подтверждающих это (профилирование показывает, что около 60% времени находится в этой области, и это вызывает у меня проблемы), но я надеюсь, что кто-то с большим знанием, чем я могу посоветовать, использую ли я не тот инструмент или что-то явно неэффективное.

...