Найти точки ndarray, которые попадают в другой ndarray

Я создал структурированный массив NumPy (называется arr) с 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,))])

Он представляет координаты XYZ, взятые из вершин трехмерного объекта ('MPtest') встроенный в ArcGIS (multipatch геометрия).

У меня есть другой массив NumPy (сгенерированный из чтения .las файл с использованием laspy модуль), называется 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 которые попадают в arr, Это вообще возможно?

Я пытался поиграть с такими функциями, как np.where, np.intersect1d, np.logical_and, и наконец np.vstack, но до сих пор я не смог этого сделать. Кроме того, у меня довольно сильный фон в Python, но все же NumPy является новым и очень сложным для моих глаз (по крайней мере, на первый взгляд...).

1 ответ

Решение

Как только вы получите неструктурированные массивы (как я вижу, вы уже достигли в комментариях), вы можете использовать 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]])

Затем вы создаете триангуляцию Делануай:

dt = Delaunay(arr)

И найдите, какие точки point_cloud находятся внутри dt (триангуляция Делануая arr):

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

Это приводит к пустому логическому массиву, указывающему, какие из точек в облаке точек находятся внутри arr.

Другие вопросы по тегам