我有大量的(x,y)
網格點與整數座標,我想測試它們是否在半徑和中心給出的圓圈數很少。點是圖像中的一些標記部分,這意味着有少量不規則形狀的塊包含點。在那裏我想檢查碰撞並計算一個圓圈內的點數。我目前的方法很慢(使用python和numpy)。在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向量化。因此,構建最完美的空間樹或類似物並不是我的目標,但我認爲一個O(n^2)算法對於幾千個點和10-20個圓應該是可能的平均速度最快臺式電腦今天。
似乎非常相關 - ['Python的矢量化嵌套的loops'(http://stackoverflow.com/questions/39667089/)。 – Divakar
你在這裏關注的所有點都是像素嗎?更具體地說,某些點的座標是否只是整數網格索引? –
是的,它們是圖像中的整數座標。 – allo