我有一个整数列表,表示属于某一行的一组3D点的索引:
pt_id = [n1, id1_1,...,id1_n1,n2,id2_1,...,id2_n2,n3,...]
这意味着第一行由n1
个点组成,行索引为id1_1
到id1_n1
,第二行由n2
个点组成行索引id2_1
到id2_n2
。行索引指的是点数组的行索引。本质上,第一行的第一个点由pts[id1_1,:]
给出,第一行的第二个点由pts[id1_2,:]
给出,第二行的第一个点由pts[id2_1,:]
给出,等等。
这些点以numpy数组的形式给出,其中每一行都是一个点坐标
pts = [[pt1x, pt1y, pt1z],
[pt2x, pt2y, pt2z],
...
[ptNx, ptNy, ptNz]]
我正在寻找最有效的方法来收集属于同一行的点到数组中。例如:
pts = [[0.0, 0.0, 0.0],
[0.0, 1.0, 0.0],
[0.0, 2.0, 0.0],
[1.0, 0.0, 0.0],
[1.0, 1.0, 0.0],
[1.0, 2.0, 0.0],
[1.0, 3.0, 0.0],
[2.0, 0.0, 0.0],
[3.0, 2.5, 0.0]]
pts = np.asarray(pts)
pt_id = [3,0,1,2,4,3,4,5,6,2,7,8]
在这种情况下,处理结果应该给我3行:
line[0,:,:] = [[0.0, 0.0, 0.0],
[0.0, 1.0, 0.0],
[0.0, 2.0, 0.0]]
line[1,:,:] = [[1.0, 0.0, 0.0],
[1.0, 1.0, 0.0],
[1.0, 2.0, 0.0],
[1.0, 3.0, 0.0]]
line[2,:,:] = [[2.0, 0.0, 0.0],
[3.0, 2.5, 0.0]]
当我绘制结果中包含的各个行时,我应该得到
答案 0 :(得分:1)
以下是将属于同一行的点收集到数组中的最有效代码:
Hello how are you doing?how about you?
结果正是您想要的:
import numpy as np
pts = [[0.0, 0.0, 0.0],
[0.0, 1.0, 0.0],
[0.0, 2.0, 0.0],
[1.0, 0.0, 0.0],
[1.0, 1.0, 0.0],
[1.0, 2.0, 0.0],
[1.0, 3.0, 0.0],
[2.0, 0.0, 0.0],
[3.0, 2.5, 0.0]]
pts = np.asarray(pts)
pt_id = [3,0,1,2,4,3,4,5,6,2,7,8]
def get_line(k):
# find i, the index of pt_id such that pt_id[i] = nk
i = 0
for j in range(0, k):
i = i + pt_id[i] + 1
# read the value of nk
nk = pt_id[i]
# return the points whose indices are [idk_1, ..., idk_nk]
return pts[pt_id[i+1:i+1+nk], :]
print(get_line(0))
print(get_line(1))
print(get_line(2))
我希望这会对你有所帮助。