Эффективный поиск 2D точек в круге с использованием Python - PullRequest
0 голосов
/ 24 января 2019

Я работаю с довольно большим набором данных 2D точек (от 500 000 до 1 м), размером около 100x100. для наших целей давайте используем меньший набор данных из 1000 точек.

x = np.random.random_sample((1000,)) * 100
y = np.random.random_sample((1000,)) * 100

и, по сути, хотел бы получить индекс точек внутри окружности, расположенной в точке x0, y0 с радиусом r. Это легко достижимо с

idx = np.signbit((x - x0)*(x - x0) + (y - y0)*(y - y0) - r*r)

Затем я хотел бы сделать что-то с 2D-точками в этом круге, немного переместить x0, y0 и выполнить тот же процесс с данными в новом круге, т.е.

x0 = np.linspace(0,100,100)
y0 = np.linspace(0,100,100)
r = 2

for i in range(0,100):
    for j in range(0,100):
        idx = np.signbit((x - x0[i])*(x - x0[i]) + (y - y0[j])*(y - y0[j]) - r*r) 
        #Do Something Here with x[idx] and y[idx]

Однако поиск idx, похоже, занимает некоторое время, особенно для больших наборов данных. Есть ли способ искать точки, расположенные в окружности радиуса 2, с x0, y0 = 0,0, а затем на следующем цикле (где x0 = 0, y0 = 1) искать только атомы, близкие к индексированным как true в первом цикле (поскольку центр круга не сдвинулся далеко от тех точек, которые были отмечены как true в первом цикле).

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

Спасибо !!!

...