У меня есть большое количество точек сетки (x,y)
с целыми координатами, которые я хочу проверить, если они находятся в небольшом количестве окружностей, заданных радиусом и центром. Точками являются некоторые заметные части изображения, а это означает, что имеется небольшое количество блоков неправильной формы, которые содержат точки. Там я хочу проверить наличие столкновений и подсчитать количество точек внутри круга. Мои текущие подходы довольно медленные (с python и numpy).Быстрые точки в круговом тесте с numpy
Теперь у меня есть две задачи:
- испытание, если любая точка множества А в любом круге
- Подсчитайте число точек множества В, которые находятся в кругу
Моя текущая реализация выглядит следующим образом (setA
и setB
являются Nx2
Numpy массивов и center
является 1x2
массивом.):
1) Для каждого круга создать массив point - center
, квадрат его поэлементно и взять сумму, а затем проверить, если он меньше, чем radius**2
for circle in circles:
if (((setA - circle.center)**2).sum(axis=1) < circle.radius**2).any():
return "collision"
return "no collision"
Это может быть оптимизирована с помощью цикла питона и разбивая на первом столкновении , но обычно числовые циклы намного быстрее, чем петли питона, и на самом деле обе версии были медленнее, чем ожидалось.
2) Для каждого круга создайте массив расстояний и выполните проверку по методу, меньшему, чем радиус. Добавьте все массивы и подсчитайте ненулевые элементы результата.
pixels = sp.zeros(len(setB))
for circle in circles:
pixels += (((setB - circle.center)**2).sum(axis=1) < circle.radius**2)
return np.count_nonzero(pixels)
Есть ли простой способ ускорить это?
Я не хочу более оптимизировать (и сделать программу намного сложнее), но просто использовать numpy наиболее эффективным способом, используя как можно больше векторизации numpy.
Таким образом, создание самого совершенного пространственного дерева или аналогичного не является моей целью, но я считаю, что алгоритм O (n^2) для нескольких тысяч точек и 10-20 кругов должен быть таким же быстрым способом в среднем настольный компьютер сегодня.
Кажется очень актуален - [ 'Python векторизация вложенная для следующей итерации цикла] (http://stackoverflow.com/questions/39667089/). – Divakar
Все ли точки, которые вы касаетесь здесь пикселей? В частности, являются ли координаты в какой-либо точке только целыми индексами сетки? –
Да, это целые координаты в изображении. – allo