问题:查找位于具有中心C和半径R的球体内的所有点
例如,找到下面的图片,这解释了简单2D案例的问题。每个点的标签(N)和坐标(x,y)是已知的。我需要找到位于红圈内的所有点标签
此处附有包含7.25 M点坐标的示例输入文件point file。
我尝试了下面这段代码
import numpy as np
C = [50,50,50]
R = 20
centroid = np.loadtxt('centroid') #chk the file attached
def dist(x,y): return sum([(xi-yi)**2 for xi, yi in zip(x,y)])
elabels=[i+1 for i in range(len(centroid)) if dist(C,centroid[i])<=R**2]
有什么建议让它更快?
谢谢, Prithivi
答案 0 :(得分:1)
不,没有内置功能来执行此操作。但是,有一些结构可以使搜索语法简洁。还有几何包,包括您可能会觉得有用的 Point 数据类型,以及支持距离函数。
如果没有看到你选择的设置代码,我能提供的就是这样:
neighbours = [point for point in point_list if dist(C, point) < R]
采用这种结构的另一种方法是在点列表中使用过滤器方法;你会注意到结构上的相似之处。
对评论的回应
编辑问题中是否显示了设置:点是否经常间隔?在这种情况下,完全删除列表 C ,只需使用几个参数计算邻居。如果这些点是随意分布的,那么你可以通过构建每个点的近邻图来获得一些加速。然后,您可以使用基于距离的图遍历算法,比每次进行邻域搜索更快地收集附近的点。
简单的插入
当您阅读每个点时,请根据图表中的现有点进行检查,随时随地构建邻域。最重要的是,使用三角不等式作为武器。例如,如果当前点 x 与 a 点相比至少为2 * m个单位,那么 a 中的 no 点的邻居可能在 x 的附近。
如果您愿意,还可以在图表中的区域之间保留一些长途链接。这可以让您从搜索中消除更远的邻域。一般来说,如果你计算d(a,x)为 q 而d(a,b)为 r ,那么
|q-r| <= d(x,b) <= q+r
如果此范围不包括2 * m,那么您可以同样消除 b 的整个社区。 p>