Поиск ближайших соседей на расстоянии и получение среднего значения этих соседей с использованием cKDTree

Я использую сценарии Python для чтения двух больших (миллионы точек) облаков точек в виде массивов («A» и «B»).

Мне нужно найти ближайших соседей "B" точек в "A", но в пределах 5 см от каждой точки в "A". Я также хочу усреднить соседей в радиусе 5 см от точек в «А».

Есть ли способ сделать это, используя cKTree сразу, включая усреднение?


person brainier7    schedule 24.10.2016    source источник


Ответы (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, которые находятся не более чем в 5 единицах от каждой точки в B:

# 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)
person David de la Iglesia    schedule 29.10.2016

cKDTree не имеет юнитов; Я надеюсь, что все ваши измерения указаны в единицах (см) в соответствии с вашими желаемыми манипуляциями.

Что вы имеете ввиду, что хотите "усреднить соседей"? Является ли это просто средним расположением всех соседей в шаре из 5 единиц?

Судя по тому, что вы написали, я считаю, что критической операцией для вас является

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

Теперь просто «усредните» баллы в капюшоне. Я предполагаю, что вы знаете, как сделать эту часть; cKDTree не имеет такой операции, поскольку SciPy и Python предоставляют ее для базовых типов.

Вы можете сделать это с A в качестве первого аргумента для query_ball_point, но тогда вы получите огромный список окрестностей и, возможно, потеряете предел памяти.

Это заставляет вас двигаться?

person Prune    schedule 24.10.2016