python - 使用列表推导使用第三个数组的索引将数据从一个数组移动到另一个数组
问题描述
我试图找到更有效和更快的方法将对象列表解压缩到其组成部分中。我目前正在使用的方法是这样的:
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
?
解决方案
这种重构应该会给你带来一点速度的提升,并使你的代码更干净:
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
将三行代码简化为一行。 - 我使用了slicing和star-unpacking来简化一些列表索引代码,这也具有减少每次迭代的点查找次数的效果。
推荐阅读
- uwp - DeviceCodeProvider 在哪里?
- javascript - 当页面完成加载时,我如何使我的模态 jquery 加载
- javascript - 用户通过命令行在 node.js 中输入数组
- reactjs - 未找到模块 - 在 NextJS 中导入 svg
- c# - 与提示输入凭据的 Dynamics 365 Online Web API 集成
- azure-devops - Power BI 测试报告:没有错误的测试运行失败
- angular - Formio:如何向 html 元素添加工具提示?
- mysql - Laravel 允许 Model::create() 上的空日期但不允许 Model->update()
- scala - 列表的类型别名在擦除后导致相同的类型
- c# - SQL、UserControla 和 FlowLayoutPanel