查找落在另一个 ndarray 中的 ndarray 的点
Find the points of a ndarray that fall inside another ndarray
我用 arcpy
模块创建了一个 NumPy 结构化数组(称为 arr
):
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 中构建的 3d 对象 ('MPtest'
) 的顶点获取的 XYZ 坐标(multipatch
几何体)。
我有另一个 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')])]
我希望能够获得落在 arr
内的 point cloud
点的索引。这可能吗?
我一直在尝试使用 np.where
, np.intersect1d
, np.logical_and
, and finally np.vstack
等函数,但到目前为止,我无法做到这一点。此外,我在 Python 方面拥有相当强大的背景,但在我看来 NumPy 仍然是一种新事物并且非常复杂(至少乍一看......)。
一旦获得非结构化数组(正如我看到您已经在评论中实现的那样),您可以按如下方式使用 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 三角剖分:
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 内。
我用 arcpy
模块创建了一个 NumPy 结构化数组(称为 arr
):
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 中构建的 3d 对象 ('MPtest'
) 的顶点获取的 XYZ 坐标(multipatch
几何体)。
我有另一个 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')])]
我希望能够获得落在 arr
内的 point cloud
点的索引。这可能吗?
我一直在尝试使用 np.where
, np.intersect1d
, np.logical_and
, and finally np.vstack
等函数,但到目前为止,我无法做到这一点。此外,我在 Python 方面拥有相当强大的背景,但在我看来 NumPy 仍然是一种新事物并且非常复杂(至少乍一看......)。
一旦获得非结构化数组(正如我看到您已经在评论中实现的那样),您可以按如下方式使用 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 三角剖分:
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 内。