【发布时间】:2017-07-08 23:30:29
【问题描述】:
我有大量具有整数坐标的(x,y) 网格点,我想测试它们是否位于由半径和中心给出的少量圆中。这些点是图像的一些标记部分,这意味着有少量不规则形状的块,其中包含这些点。在那里我想检查碰撞并计算圆内的点数。我目前的方法相当慢(使用 python 和 numpy)。
现在我有两个任务:
- 测试,如果集合 A 的任何点在任何圆内
- 计算集合 B 中的点数,这些点在一个圆圈中
我当前的实现如下所示(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"
这可以通过使用 python 循环并在第一次碰撞时中断来优化,但通常 numpy 循环比 python 循环快很多,实际上两个版本都比预期慢。
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 矢量化。
所以构建最完美的空间树或类似的空间树不是我的目标,但我认为在普通桌面上应该可以以最快的方式处理几千个点和 10-20 个圆的 O(n^2) 算法今天的电脑。
【问题讨论】:
-
似乎非常相关 -
Python vectorizing nested for loops。 -
你关心的点都是像素吗?更具体地说,某个点的坐标是否只是整数网格索引?
-
是的,它们是图像中的整数坐标。
-
numexpr模块获得了一定的性能百分比。
标签: performance numpy scipy geometry