我有两个不同的目录($dates = "2019-01-21 to 2019-01-31";
list($from_date, $to_date) = array_map(function($date) {
return Carbon\Carbon::parse($date);
}, explode('to', $dates));
和data_in
)点多的data_out
的坐标。如下图所示,我需要找到所有x,y
的点是接近data_in
的点,特别是所有data_out
半径的圆内的点data_in
,集中于每{{ 1}}分。
这个小脚本可以正常工作,但是非常慢。有办法加快这个过程吗?
r_search
答案 0 :(得分:1)
您描述的应用程序最快的算法是k-dimensional tree,尤其是二维树,更好地称为quad-tree。它的工作方式是将您拥有的大数组划分为包含闭合点组的较小数组。
可以自己实现,但不建议这样做,因为有些库的优化程度超出了您自己的能力。 几年前,有some discussion是最好的。但是现在可以说this库是最好的。
答案 1 :(得分:1)
一种可能的优化方法是从距离计算中删除(昂贵的)平方根,然后与平方搜索半径进行比较,因此:
r_tmp = np.sqrt(np.power(delta_x,2) + np.power(delta_y,2))
if (r_tmp <= r_search):
成为:
r_tmp = np.power(delta_x,2) + np.power(delta_y,2)
if (r_tmp <= r_search*r_search):