找到落入另一个ndarray内的ndarray的点

时间:2017-03-22 15:33:02

标签: python arrays numpy arcpy laspy

我创建了一个带有arr模块的NumPy结构化数组(名为arcpy):

arr = arcpy.da.FeatureClassToNumPyArray('MPtest','SHAPE@XYZ',explode_to_points=True)

数组看起来像(只显示第一行):

array([([309243.1420999998, 6143470.0293, 470.43829999999434],),
       ([309252.14080000017, 6143461.0857, 470.43829999999434],),
       ([309246.0201000003, 6143459.2754, 470.43829999999434],),
       ........................................................,
       ([309252.14080000017, 6143461.0857, 464.6000000000058],)], 
      dtype=[('SHAPE@XYZ', '<f8', (3,))])

它表示从ArcGIS中构建的三维对象('MPtest')的顶点(multipatch几何体)获取的XYZ坐标。

我有另一个NumPy数组(使用laspy模块读取.las文件生成),称为point_cloud。这个数组看起来像:

[((30922713, 614349673, 46679, 154, 17, 1, -10, 79, 5,  11570.850892),)
 ((30922712, 614349659, 46674, 112, 17, 1, -10, 78, 5,  11570.850897),)
 ((30922709, 614349645, 46663, 161, 17, 1, -10, 77, 5,  11570.850902),),
 ..................................................................,)],
[('point', [('X', '<i4'), ('Y', '<i4'), ('Z', '<i4'), ('intensity', '<u2'), ('flag_byte', 'u1'), ('raw_classification', 'u1'), ('scan_angle_rank', 'i1'), ('user_data', 'u1'), ('pt_src_id', '<u2'), ('gps_time', '<f8')])]

我希望能够得到point cloud的{​​{1}}点的索引。arr。这甚至可能吗?

我一直在尝试使用np.wherenp.intersect1dnp.logical_and以及最后np.vstack等功能,但到目前为止,我无法去做。另外,我在Python中有相当强大的背景,但是NumPy仍然是一种新的,我的眼睛非常复杂(至少乍一看......)。

1 个答案:

答案 0 :(得分:2)

一旦你获得了非结构化数组(正如我在评论中看到的那样),你可以使用scipy.spatial.Delanuay,如下所示:

我只是创建一个示例框和一些要点来澄清示例:

import numpy as np
from itertools import product
from scipy.spatial import Delaunay

arr = np.array(list(product([0,1], repeat=3)))
arr
array([[0, 0, 0],
       [0, 0, 1],
       [0, 1, 0],
       [0, 1, 1],
       [1, 0, 0],
       [1, 0, 1],
       [1, 1, 0],
       [1, 1, 1]])
point_cloud = np.array([[0.5,0.5,0.5], [2,2,2]])

然后创建Delanuay Triangulation:

dt = Delaunay(arr)

找到point_cloud中的点数在dt内部(Arr的Delanuay三角剖分):

points_inside_arr = dt.find_simplex(point_cloud) >=0
points_inside_arr
array([ True, False], dtype=bool)

这导致一个numpy布尔数组,表明点云中的哪些点位于arr内。