使用python,我想知道一个点(有三个坐标)是否比另一个给定点更接近2厘米

使用python,我想知道一个点(有三个坐标)是否比另一个给定点更接近2厘米,python,math,bioinformatics,computational-geometry,Python,Math,Bioinformatics,Computational Geometry,我有两个这样的numpy.ndarray,但还有更多行: A = numpy.array([[7.087, 0.038, -130.550], [0.073, 1.224, -13.257]]) B = numpy.array([[20.047, -0.038, -12.551], [16.073, 1.224, 13.257]]) 每行是一个点,每个元素是空间中的x、y、z 如何确定有多少点距离小于2厘米 我想出

我有两个这样的numpy.ndarray,但还有更多行:

A = numpy.array([[7.087,  0.038, -130.550],
                 [0.073,  1.224,  -13.257]])

B = numpy.array([[20.047, -0.038, -12.551],
                 [16.073,  1.224,  13.257]])
每行是一个点,每个元素是空间中的x、y、z

如何确定有多少点距离小于2厘米

我想出了不同的方法来解决这个问题。可以创建半径为2的球体。如果A的一个点位于B的一个点的球体内,则表示它们的距离小于2厘米


我想我可以创建一个程序来解决这个问题,但我不确定当a的一个点比B的两个或更多点更接近时,我如何知道总点数,因为我想要的是总点数更接近,我指的是a和B的总和,它们比2厘米更接近

这里是一个使用numpy的矢量化方法。它创建了一个N_a-x-3-x-N_b数组,基本上是a和b的所有元素的笛卡尔积。然后,它使用numpy.linalg.norm函数计算与长度3对应的轴上的欧几里德范数


如果您只需要检查a或b中的一个点是否接近另一个数组中的任何点,您可以用上面表达式中的numpy.any替换numpy.sum。

我想我会选择一个scipy距离矩阵:

如果我是对的,您需要计算由a点和b点组成的比给定距离更近的对

最简单的解决方法是使用蛮力:依次尝试所有可能的对(有A.B对),当距离足够短时,增加一个计数器。如果A.B是合理的,这是可以接受的

如果有很多点,我建议将B的点存储在kD树中,这里k=3,以便高效查询。然后,对A的每个点执行固定半径的近邻搜索。这将把运行时间从A.B减少到大约A.logB+n,其中n是一个点的近邻的平均数


由于近邻关系是对称的,因此不需要从B中搜索A。

是否需要快速?如果不是的话,你可以创建一个嵌套循环,然后将每个循环与另一个循环进行比较。我是python新手,所以我不知道如何将两点与两厘米的差异进行比较,你想知道B中所有在2cm以内的点吗?是的,最后要知道点的总数,也就是比2b更接近的点的数目,通过我找到的公式,可以计算x-cx^2+y-cy^2+z-cz^2import numpy a = numpy.array([ [7.9, 0.0, -130.6], [0.1, 1.2, -13.3] ]) b = numpy.array([ [20.0, -0.0, -12.6], [16.1, 1.2, 13.3], [ 0.5, 1.5, -12.0], [ 8.0, 1.0, -131.0], ]) RADIUS = 2.0 d = a[:, :, numpy.newaxis] - b[:, :, numpy.newaxis].T # shape: (2, 3, 4) close = numpy.linalg.norm(d, ord=2, axis=1) < RADIUS # Result: # array([[False, False, False, True], # [False, False, True, False]])
a_close_count = numpy.sum(close, axis=-1)
# Result: 
#   array([1, 1])

b_close_count = numpy.sum(close, axis=0)
# Result:
#   array([0, 0, 1, 1])