我有一个 3D 点云,保存在两个列表中。具有 5 个点 (x,y,z) 的示例:(3,3,3), (1,1,1), (4,4,4), (2,2,2), (5,5,5 ) -> 我的列表如下所示:
z = [3, 1, 4, 2, 5] # the z values
pts = [(3,3), (1,1), (4,4), (2,2), (5,5)] # the x and y values
现在我想消除 z 值高于 3 的所有值:
# what I want to receive:
z = [3, 1, 2]
pts = [(3,3), (1,1), (2,2)]
我的算法在这里:
k = -1
for i in range(len(z)):
k += 1
if z[k] > h:
z.pop(k)
pts.pop(k)
k -= 1
这会返回我想要的结果 - 但速度非常慢(对于 >100,000 个值)。 我考虑过先通过 z.sort() 对我的列表进行排序,然后执行 z = z[:index] - 但是当我对我的 z-list 执行此操作时,我的 pts-list 仍然未排序。即使我可以对两个列表进行排序,我是否也必须通过一个很长的 loop 来找到我的条件为 true 的索引? 有谁知道更有效的解决方案?
请您参考如下方法:
z, pts = zip(*[(z, pt) for z, pt in zip(z, pts) if z <= 3])
print z, pts
输出
(3, 1, 2) ((3, 3), (1, 1), (2, 2))
