2015-11-08 54 views
0

我有一个表示一组3D点的属于一条线,像这样的指数整数列表的列表行数据是第一行由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

+0

这很含糊。为什么不横线? –

+0

,因为'pt_id'列表告诉你它们应该像我绘制它们一样排列。 (第一行由pts数组中的索引为0,1,2的点组成) – Jack

+0

我没有得到pt_id和pts之间的关系 – Moj

回答

1

这是最有效的代码,它将属于同一行的点集中到一个数组中:

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

结果是你想要什么:

[[ 0. 0. 0.] 
[ 0. 1. 0.] 
[ 0. 2. 0.]] 

[[ 1. 0. 0.] 
[ 1. 1. 0.] 
[ 1. 2. 0.] 
[ 1. 3. 0.]] 

[[ 2. 0. 0. ] 
[ 3. 2.5 0. ]] 

我希望这会帮助你。

+0

“最高效的代码” - 这是一个非常大胆的声明 –

+0

我承认。对于单个查询,我非常肯定它是最高效的代码。原因是我们必须找到'i',唯一的方法就是访问'n1',...,'nk'。所以我们需要时间步骤。但是对于多个查询,预处理步骤应该可以提高时间复杂度。 – Flabetvibes