我有一个 3D 点列表,这个列表看起来像(但包含大约 45k 点)
array([[0.77258706, 1.1149821 , 1.0494938 ],
[0.77258706, 1.1149821 , 1.0494938 ],
[0.77258706, 1.1149821 , 1.0494938 ],
[1.3196146 , 1.2129393 , 0.96248001],
[1.3197775 , 1.2117194 , 0.96213955],
[1.3199375 , 1.2104989 , 0.96179962],
[1.3200942 , 1.2092786 , 0.96145791],
[1.3202487 , 1.2080572 , 0.96111906],
[1.3204001 , 1.2068353 , 0.96078068]])
我想将它们投影到 2D 画布上。
由于点云已经正确对齐,我可以直接从点获取 x 和 y 坐标,并使用 z 分量来设置颜色(所有值都会缩放以适合画布)。
canv = np.zeros(shape=[3840, 2160, 3])
for p in ps:
x_pos = p[0] * scale_factor
y_pos = p[1] * scale_factor
val = p[2] * color_scale_factor
canv[int(x_pos)][int(y_pos)][0:3] = colors[int(val)].get_rgb()
目前这需要大约时间。每帧 120 毫秒 (8FPS)。
有没有办法通过使用一些 numpy 魔法来显着改善这一点? 如有任何帮助,我们将不胜感激。
使用 numpy 矢量化函数而不是 for 循环可能会发现一些改进,但是由于我不知道 color[val].get_rgb() 的作用,所以我无法建议解决方案。
但是,您可以尝试将函数包装在 numba jit 包装器中,这会预编译 python 代码并可以并行执行 for 循环。
import numba as nb
@nb.njit(parallel=True)
def convert(array_3d):
canv = np.zeros(shape=[3840, 2160, 3])
for p in array_3d:
x_pos = p[0] * scale_factor
y_pos = p[1] * scale_factor
val = p[2] * color_scale_factor
canv[int(x_pos)][int(y_pos)][0:3] = colors[int(val)].get_rgb()
return canv