每个邻居用一次sklearn neighb

2024-04-19 21:45:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在比较两种不同大小的点云。我不想切断更大的点云pc1的最后一点。对于pc1中的点,我想找到pc2中最近的邻居。在pc1和pc2中使用此点后,应而不是再次用于任何其他比较。计算从pc1到pc2的距离:从最小距离开始。取pc1和pc2中的两个点,并将这些点标记为已使用(或删除)。获得更高距离的下一双鞋。。。直到pc2中的所有点都被使用。返回距离列表。你知道吗

以下是我迄今为止尝试的:

from sklearn.neighbors import NearestNeighbors
import numpy as np

pc1 = np.array([[-1, -1], [-2, -1], [1, 1], [2, 2], [3, 5]])
pc2 = np.array([[0, 0], [0, 0], [6,6]])

nbrs = NearestNeighbors(n_neighbors=1, algorithm='kd_tree', metric='euclidean').fit(pc2)
distances, indices = nbrs.kneighbors(pc1)

这是输出:

indices = [[0],[0],[0],[0],[2]]

但我想要:

indices_wanted = [[0],[1],[2]]

应参考pc1中的点:[-1,-1],[1,1],[3,5]]

有没有有效的方法?我的点云是三维的,每个点云大约有8000个点。它应该是非常快,因为我需要重复这个过程,在一些“电影”的每一帧200帧。 在3D中创建一些示例数据:

    pc1 = np.random.randn(8000,3)
    pc2 = np.random.randn(7990,3)

下面是一张图片来说明情况: Points in Cube

红色点是pc1,绿色点是pc2。最终,我得到了三维点。你知道吗


编辑:

我不局限于学习,我只知道这是非常有效的。所以KDTree也是一种选择。 我可能要包括两个节点的最大距离来加速这个方法。我正在使用的多维数据集大小为4米(在运行邻居搜索之前,我已经删除了太远的点)


问题: @user2874583提供的代码对于一个拥有8000个点的集合大约需要0.8秒。太慢了。我需要不到0.2秒的时间。有没有办法修改代码来利用这个结构:没有点的立方体?也许整理一下数组?你知道吗


Tags: 数据方法代码import距离npneighborsrandom
1条回答
网友
1楼 · 发布于 2024-04-19 21:45:33

您可以使用scipy库来计算到点之间的距离。你知道吗

from scipy.spatial.distance import cdist

def closest_node_index(node, nodes):
    index = cdist([node], nodes).argmin()
    return index

final = []
for arr in pc2:
    i = closest_node_index(arr, pc1)
    final.append(pc1[i])
    pc1 = np.delete(pc1, i, axis=0)

相关问题 更多 >