Обновление Ответ о коде
Дело в том, что наивные циклы "for" медленны в Python, и у вашего кода большой цикл for.Чтобы получить максимальную скорость для Python, вы должны либо попытаться «векторизовать» свой код , либо использовать numba и попытаться переписать свой код с помощью циклов for, как вы писали на C ++.
Старый ответ
Итак, если я правильно понимаю ваш вопрос, вот как вы могли бы сделать это, используя https://github.com/daavoo/pyntcloud
Загрузить пример облака точек:
from pyntcloud import PyntCloud
cloud = PyntCloud.from_file("tests/data/sphere.ply")
Что выглядит следующим образом:
Затем необходимо построитьсетка неперекрывающихся ячеек (называемая voxelgrid в pyntcloud).
Здесь size_x
и size_y
- это способ указания размера ячейки вдоль каждой оси.
voxelgrid_id = cloud.add_structure("voxelgrid", size_x=10, size_y=10)
Сетка вокселей выглядит следующим образом:
И, наконец, вы можете получить новое облако точек, выбрав самую высокую точку каждой ячейки:
thinned_cloud = cloud.get_sample(
"voxelgrid_highest",
voxelgrid_id=voxelgrid_id,
as_PyntCloud=True)
Что выглядит следующим образом:
Вы можете получить доступ к значениям xyz нового разреженного облака точек следующим образомows:
data = thinned_cloud.xyz
Это внутренне использует pandas.groupby, что должно повысить скорость по сравнению с кодом, который вы опубликовали.Однако, если это не так быстро, я бы порекомендовал вам попробовать https://numba.pydata.org/
. Есть несколько примеров операций, которые могут быть вам полезны в https://github.com/daavoo/pyntcloud/blob/master/pyntcloud/utils/numba.py