在Python中为3D空间中的numpy.ndarray查找最近邻。

7
我有一个包含3D点的numpy.ndarray,其np.shape为(4350,3),还有另一个包含3D点的numpy.ndarray,np.shape为(10510,3)。 现在我正在尝试找到正确的Python软件包,以尽可能快地计算第二个数组中距离第一个数组中的点最近的邻居。 我在这里找到了一个非常相似的问题:find the k nearest neighbours of a point in 3d space with python numpy,但我不知道如何将那里的解决方案用于我的问题。 非常感谢您的帮助!

1
这是一次性的操作还是您将在同一组中查找多个最近邻居?我之所以问这个问题,是因为如果它是单次操作并且您每次只是寻找新集合上的1个点,那么简单的循环查找最小平方距离就足够了,并且速度最快。 - Victor 'Chris' Cabral
@Victor'Chris'Cabral 目前我实现的是通过计算第一个集合中每个点与第二个集合中每个点之间的欧几里得距离来找到最近的邻居(4350*10510 = 45718500次),并返回最接近距离的点。但是,我在一个 while 循环中执行所有这些操作,该循环运行了约20次,并且对于多个“第一个”点集,因此这种朴素的经典方法需要几个小时。 - Studentu
1
我肯定说错了。我现在看到你的问题了。 - Victor 'Chris' Cabral
3
建议将较小的数据集构建成kd树,然后执行循环。参考文档:https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.spatial.KDTree.html - Victor 'Chris' Cabral
@Victor'Chris'Cabral 感谢您提供的链接和建议!我之前已经阅读了那份文档,但是我不知道如何将其应用到我的问题上(如果这在文档中应该很清楚,那我很抱歉,我并不擅长编程)。您能否给我一个示例,说明如何解决我的问题(我指一般情况下的两个三维点集)? - Studentu
显示剩余2条评论
1个回答

8
这里是使用 KDTree 的方法:
from scipy.spatial import KDTree

data= np.random.rand(10510,3)
sample= np.random.rand(4350,3)
kdtree=KDTree(data)

然后 dist,points=kdtree.query(sample,2) 将在约一秒钟内为4350个候选项中提供两个最佳邻居。


非常感谢,我会尝试这种方法,然后告诉您它是否有效! - Studentu
很抱歉,我不明白kdtree.query(sample,2)的返回值是什么意思。我本来以为在dist中会有到最近邻居的欧几里得距离(因为参数2代表欧几里得距离),而points则是“data”点集中最接近“sample”的点。 但是dist看起来像这样: print(dist) [[0.02731417 0.03267154] [0.02175954 0.04624616] ... [0.03183459 0.03818426] [0.01794547 0.03079906]] 而points则像这样: print(points) [[ 262 5545] [3667 5619] ... [ 696 9467] [9617 1987]] 所以我显然是错的。 - Studentu
哦,我认为kdtree.query(sample,2)被解释为kdtree.query(sample, k=2)而不是kdtree.query(sample, p=2),但我需要的是后者,对吗? - Studentu
没有p=2是默认值。k是指k个最近的点。如果你只想要最近的一个,那么kdtree.query(sample,1)或者kdtree.query(sample)就足够了,因为k=1是默认值。 - B. M.
是的,那就是我的意思。感谢您的回答,您的帮助非常好! - Studentu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接