我有几千个点,表示为纬度和经度的二维浮动数组。(42.385305, -87.963793)(41.703427, -88.121665)(41.889764, -87.978553)(41.995931, -87.787501)(42.25875, -87.948199) . . .在该集合中,纬度的最小值和最大值分别为34.03176和42.470814,经度的最小值和最大值分别为-118.23 819和-87.598201。我想将这些点分成0.025纬度和0.03经度的区域,然后考虑每个区域一次,对每个区域的点进行一些计算和操作。或者,如果我能找到两个或两个以上的点距离太近的区域,比如半径在3公里以内,那就更好了。我曾想过使用散列映射或2D数组,但是设置有效的键或引用正确的区域将很棘手。R-tree可能不合适,因为它的构建很复杂,效率不高,特别是考虑到我不需要随机访问正如我前面提到的,我正在一个一个地穿越每一个区域。做这件事的有效方法是什么? 最佳答案 如果将距离计算完全矢量化,几千个点应该不会花那么长时间:In [1]:from numpy import *In [3]:def lg_lat_distance(p1,p2): #based on Spherical Law of Cosines lg1=p1[0] #data format, (latitude, longitude) la1=p1[1] lg2=p2[0] la2=p2[1] return arccos(sin(la1)*sin(la2)+cos(la1)*cos(la2)*cos(lg1-lg2))*6371 #in kmIn [14]:data=array([(42.385305, -87.963793), (41.703427, -88.121665), (41.889764, -87.978553), (41.995931, -87.787501), (42.25875, -87.948199)]) #5 elementsdata=data/180*piIn [16]:dist_matrix=(lg_lat_distance(hstack([data,]*5).reshape(-1,2).T, vstack([data,]*5).T)).reshape(5,5)print dist_matrix[[ 9.49352980e-05 1.77442357e+01 2.54929710e+00 1.96682533e+01 1.80515399e+00] [ 1.77442357e+01 0.00000000e+00 1.59289162e+01 3.71753501e+01 1.94041828e+01] [ 2.54929710e+00 1.59289162e+01 0.00000000e+00 2.12484793e+01 3.67668607e+00] [ 1.96682533e+01 3.71753501e+01 2.12484793e+01 0.00000000e+00 1.79018035e+01] [ 1.80515399e+00 1.94041828e+01 3.67668607e+00 1.79018035e+01 9.49352980e-05]]In [17]:%timeit dist_matrix=(lg_lat_distance(hstack([data,]*5).reshape(-1,2).T, vstack([data,]*5).T)).reshape(5,5)1000 loops, best of 3: 245 µs per loop我想事情会变得容易一点。可以用成对距离使用布尔索引筛选出对。或者可以运行聚类分析。关于python - 按接近度对一组点进行分组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21807654/
10-11 22:26
查看更多