【问题标题】:finding nearest neighbor for python numpy.ndarray in 3d-space在 3d 空间中为 python numpy.ndarray 找到最近的邻居
【发布时间】:2019-06-04 11:58:41
【问题描述】:

我有一个 numpy.ndarray 的 3d 点,即它的 np.shape 是 (4350,3) 和第二个 numpy.ndarray 的 3d 点的 np.shape (10510,3)。 现在我正在尝试找到正确的 python 包来尽快计算第一个数组中点的第二个数组中的最近邻居。

我在这里发现了一个非常相似的问题:find the k nearest neighbours of a point in 3d space with python numpy 但我不明白如何使用那里的解决方案来解决我的问题。

非常非常感谢您在这方面的帮助!

【问题讨论】:

  • 这是一次性操作还是要在同一个集合中找到多个最近的邻居?我这样问是因为如果它是一个单一的操作,并且您实际上每次只在新集合上寻找 1 个点,那么一个简单的 1 次循环寻找最小平方距离就足够了,并且是最快的。
  • @Victor'Chris'Cabral 不,到目前为止我已经实现的是通过计算第二个集合的每个点的第一个集合的每个点的欧几里得距离来找到最近的邻居(4350 * 10510 = 45718500 次)并返回最近距离的点。但是所有这一切我都是在一个运行约 20 次的 while 循环中完成的,并且针对几个“第一”点集,所以这种天真的经典方法需要几个小时。
  • 我肯定说错了。我现在看到了你的问题。
  • 我建议从较小的集合中创建一个 kdtree,然后进行循环。 docs.scipy.org/doc/scipy-0.14.0/reference/generated/…
  • @Victor'Chris'Cabral 感谢您的链接和建议!我以前通读过该文档,但我不知道如何将其应用于我的问题(对不起,如果这应该从文档中清楚,我不太擅长编程)。你能给我一个例子,说明这对于我的问题(我的意思是,一般来说对于两个 3D 点集)是怎样的?

标签: python python-3.x numpy nearest-neighbor numpy-ndarray


【解决方案1】:

这里是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 个候选人的 2 个最佳邻居。

【讨论】:

  • 非常感谢,我会这样尝试,然后告诉你是否有效!
  • 对不起,我不明白 kdtree.query(sample,2) 的返回是什么意思。我预计在 dist 中存在到最近邻居的欧几里得距离(因为参数 2 代表欧几里得距离),而点是来自点集“数据”的点,这些点最接近“样本”。但是 dist 看起来像这样: print(dist) [[0.02731417 0.03267154] [0.02175954 0.04624616] ... [0.03183459 0.03818426] [0.01794547 0.03079906]] 和这样的点: print(points) [[ 262 5154] [[ 262 5154] 366 .. [696 9467] [9617 1987]] 所以我显然错了。
  • 哦,我认为 kdtree.query(sample,2) 被解释为 kdtree.query(sample, k=2) 而不是 kdtree.query(sample, p=2),但我需要什么是后者吧?
  • no p=2 是默认值。 k 用于 k-最近点。如果您只想要最近的 kdtree.query(sample,1) 或 kdtree.query(sample) 就足够了,因为 k=1 是默认值。
  • 是的,这就是我的意思。谢谢你的回答,很高兴你能帮忙!
猜你喜欢
  • 2018-06-26
  • 2019-11-28
  • 1970-01-01
  • 2021-04-29
  • 1970-01-01
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
相关资源
最近更新 更多