使用cKDTree查找距离内最近的邻居,并取这些邻居的平均值

4

我正在使用Python脚本将两个大型(数百万点)点云作为数组(“A”和“B”)读入。

我需要找到“A”中每个点周围5厘米内最近的“B”邻居。我还想计算在“A”点5厘米半径内的邻居的平均值。

是否有一种方法可以一次性地使用cKTree完成这个任务,包括平均值计算?

2个回答

2

我不确定你想要做什么,但如果我理解正确,你可以按照以下步骤操作:

# this are just random arrays for test
A = 20 * np.random.rand(1000, 3)
B = 20 * np.random.rand(1000, 3)

为每个点云计算cKDTree

tree_A = cKDTree(A)
tree_B = cKDTree(B)

找到A中与B中每个点距离最多为5个单位的点:

# faster than loop + query_ball_point
neighbourhood = tree_B.query_ball_tree(tree_A, 5)

计算所有点组的平均值:

means = np.zeros_like(A)
for i in range(len(neighbourhood)):
    means[i] = A[neighbourhood[i]].mean(0)

0

cKDTree没有任何单位;我希望你的测量值都是以厘米为单位进行的,以便进行所需的操作。

你说的“平均邻居”是什么意思?这只是5个单位球内所有邻居的平均位置吗?

根据你发布的内容,我认为对你来说关键的操作是:

for A_point in A:
    hood = B.query_ball_point(A_point, 5)

现在,只需在hood中“平均”点。 我假设您知道如何完成该部分。 cKDTree没有这样的操作,因为SciPy和Python在基本类型上提供了这些操作。
您可以使用A作为query_ball_point的第一个参数来完成此操作,但是那么您将获得一个巨大的邻域列表,并且可能会超出内存限制。
这能帮到您吗?

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