使用python,我想知道一个点(有三个坐标)是否比另一个给定点更接近2厘米
我有两个这样的numpy.ndarray,但还有更多行:使用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厘米 我想出
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^2
import 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])