首页 > 解决方案 > 使用列表推导使用第三个数组的索引将数据从一个数组移动到另一个数组

问题描述

我试图找到更有效和更快的方法将对象列表解压缩到其组成部分中。我目前正在使用的方法是这样的:

points_fill_v2 = o3d.geometry.VoxelGrid.create_from_point_cloud(points,
                                                            voxel_size=vox)
scrap = points_fill_v2 .get_voxels()
resize3d = np.ones((3, 64, 64, 64))

for idx in range(len(scrap)):
    resize3d[0, scrap[idx].grid_index[0], scrap[idx].grid_index[1], scrap[idx].grid_index[2]] = scrap[idx].color[0]
    resize3d[1, scrap[idx].grid_index[0], scrap[idx].grid_index[1], scrap[idx].grid_index[2]] = scrap[idx].color[1]
    resize3d[2, scrap[idx].grid_index[0], scrap[idx].grid_index[1], scrap[idx].grid_index[2]] = scrap[idx].color[2]

scrap是一个列表,如下所示:

[Voxel with grid_index: (7, 27, 30), color: (0, 0, 1), Voxel with grid_index: (32, 9, 8), color: (0, 0, 0), ......] 

它有2个属性;网格索引和颜色,都是 numpy 1,3 数组。

上面的代码使用 open3d 将点云转换为体素数据集(我必须使用 open3d),然后将其转换为 RGB 3d numpy 数组。

我可以使用以下方法将主列表拆分为 2 个其他列表(然后是数组):

grid = [scrap[idx].grid_index for idx in range(len(scrap))]
colour = [scrap[idx].color for idx in range(len(scrap))]

如何resize_3d使用存储在中的索引有效地将彩色数据传输到grid

标签: python

解决方案


这种重构应该会给你带来一点速度的提升,并使你的代码更干净:

from itertools import product
 
points_fill_v2 = o3d.geometry.VoxelGrid.create_from_point_cloud(points, voxel_size=vox)
scrap = points_fill_v2.get_voxels()
resize3d = np.ones((3, 64, 64, 64))

for (idx, scrap_elem), j in product(enumerate(scrap), range(3)):
    resize3d[(j, *scrap_elem.grid_index[:3])] = scrap_elem.color[j]

我在这里做过的事情:


推荐阅读