我正试图找到更有效和更快的方法将对象列表解包到其组成部分中。我目前使用的方法是:
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
将三行代码减少为一行。 - 我使用了切片,结合星形解包,来简化一些列表索引代码,这也有减少每次迭代的点查找次数的效果。