使用列表推导式使用第三个数组的索引将数据从一个数组移动到另一个数组



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

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))]

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

这种重构应该会让你的速度稍微提高一点,并使你的代码更干净:

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]

我在这里做过的事情:

  • 我用enumerate(<sequence>)代替range(len(<sequence>))
  • 我使用itertools.product将三行代码减少为一行。
  • 我使用了切片,结合星形解包,来简化一些列表索引代码,这也有减少每次迭代的点查找次数的效果。

最新更新