使用点索引列表将点数转换为行数据

时间:2015-11-08 17:32:16

标签: python

我有一个整数列表,表示属于某一行的一组3D点的索引:

pt_id = [n1, id1_1,...,id1_n1,n2,id2_1,...,id2_n2,n3,...]

这意味着第一行由n1个点组成,行索引为id1_1id1_n1,第二行由n2个点组成行索引id2_1id2_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]]

当我绘制结果中包含的各个行时,我应该得到

enter image description here

1 个答案:

答案 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))

我希望这会对你有所帮助。