在Python中获取位于半径R和中心C的球体内的所有点

时间:2016-10-26 00:53:16

标签: python

问题:查找位于具有中心C和半径R的球体内的所有点

例如,找到下面的图片,这解释了简单2D案例的问题。每个点的标签(N)和坐标(x,y)是已知的。我需要找到位于红圈内的所有点标签

enter image description here

此处附有包含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

1 个答案:

答案 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 的整个社区。