将numpy数组的组名映射到索引的最快方法是什么?

问题描述 投票:0回答:1

我正在使用Lidar的3D点云。点由numpy数组给出,如下所示:

points = np.array([[61651921, 416326074, 39805], [61605255, 416360555, 41124], [61664810, 416313743, 39900], [61664837, 416313749, 39910], [61674456, 416316663, 39503], [61651933, 416326074, 39802], [61679969, 416318049, 39500], [61674494, 416316677, 39508], [61651908, 416326079, 39800], [61651908, 416326087, 39802], [61664845, 416313738, 39913], [61674480, 416316668, 39503], [61679996, 416318047, 39510], [61605290, 416360572, 41118], [61605270, 416360565, 41122], [61683939, 416313004, 41052], [61683936, 416313033, 41060], [61679976, 416318044, 39509], [61605279, 416360555, 41109], [61664837, 416313739, 39915], [61674487, 416316666, 39505], [61679961, 416318035, 39503], [61683943, 416313004, 41054], [61683930, 416313042, 41059]])

[我想将我的数据分组为大小为50*50*50的多维数据集,以便每个多维数据集都保留它包含的points的一些可散列索引和numpy索引。为了进行拆分,我将cubes = points \\ 50分配给:

cubes = np.array([[1233038, 8326521, 796], [1232105, 8327211, 822], [1233296, 8326274, 798], [1233296, 8326274, 798], [1233489, 8326333, 790], [1233038, 8326521, 796], [1233599, 8326360, 790], [1233489, 8326333, 790], [1233038, 8326521, 796], [1233038, 8326521, 796], [1233296, 8326274, 798], [1233489, 8326333, 790], [1233599, 8326360, 790], [1232105, 8327211, 822], [1232105, 8327211, 822], [1233678, 8326260, 821], [1233678, 8326260, 821], [1233599, 8326360, 790], [1232105, 8327211, 822], [1233296, 8326274, 798], [1233489, 8326333, 790], [1233599, 8326360, 790], [1233678, 8326260, 821], [1233678, 8326260, 821]])

我想要的输出看起来像这样:

{(1232105, 8327211, 822): [1, 13, 14, 18]), 
(1233038, 8326521, 796): [0, 5, 8, 9], 
(1233296, 8326274, 798): [2, 3, 10, 19], 
(1233489, 8326333, 790): [4, 7, 11, 20], 
(1233599, 8326360, 790): [6, 12, 17, 21], 
(1233678, 8326260, 821): [15, 16, 22, 23]}

我的真实点云包含多达数亿个3D点。进行这种分组的最快方法是什么?

我已经尝试了大多数各种解决方案。我的方法之一是使用熊猫:

import pandas as pd
print(pd.DataFrame(cubes).groupby([0,1,2]).indices)

稍后我继续。

python numpy hash grouping lidar
1个回答
0
投票
通过使用熊猫,您为此任务引入了巨大的开销(创建DataFrame和groupy)。您可能只是迭代并将每个元素的索引添加到相应的列表中。

from collections import defaultdict res = defaultdict(list) for idx, elem in enumerate(cubes): res[tuple(elem)].append(idx)

© www.soinside.com 2019 - 2024. All rights reserved.