首页 > 解决方案 > 在 3D numpy-array 中搜索多个 1D numpy-array

问题描述

我从表面扫描中得到了一个 stl 文件。从那里我得到了每个三角形的 3D 数组,它的 3 个点和它们的 x、y、z 坐标。

现在要查找与另一个具有 x、y、z 点坐标的二维数组共有 2 个点的所有三角形(也可以是一个列表,格式并不那么重要)。

我的 3D 数组的示例数据是

Triangle= np.array([[[0, 1, 1],
        [1, 0, 1],
        [1, 1, 2]],

       [[0, 0, 1],
        [1, 0, 1],
        [0, 1, 1]],

       [[3, 0, 1],
        [3, 1, 1],
        [2, 0, 2]],

       [[2, 0, 2],
        [3, 1, 1],
        [2, 1, 2]],

       [[1, 1, 2],
        [1, 0, 1],
        [2, 0, 2]],

       [[2, 0, 2],
        [2, 1, 2],
        [1, 1, 2]],

       [[1, 2, 3],
        [0, 1, 1],
        [1, 1, 2]],

       [[1, 2, 3],
        [0, 2, 1],
        [0, 1, 1]],

       [[0, 3, 1],
        [0, 2, 1],
        [1, 3, 2]],

       [[0, 2, 1],
        [1, 2, 3],
        [1, 3, 2]],

       [[1, 1, 2],
        [2, 1, 2],
        [2, 2, 1]],

       [[2, 2, 1],
        [1, 2, 3],
        [1, 1, 2]],

       [[2, 1, 2],
        [3, 1, 1],
        [2, 2, 1]],

       [[3, 1, 1],
        [3, 2, 1],
        [2, 2, 1]],

       [[2, 3, 1],
        [3, 2, 1],
        [3, 3, 1]],

       [[2, 3, 1],
        [2, 2, 1],
        [3, 2, 1]],

       [[2, 3, 1],
        [1, 3, 2],
        [1, 2, 3]],

       [[1, 2, 3],
        [2, 2, 1],
        [2, 3, 1]]])

和积分

points = np.array([[1, 2, 3],
       [0, 1, 1],
       [0, 2, 1],
       [1, 1, 2],
       [1, 3, 2],
       [2, 2, 1],
       [2, 3, 1]])

标签: pythonarraysnumpymultidimensional-arraynumpy-ndarray

解决方案


让我们尝试广播以将所有三角形与所有点进行比较:

compare = (Triangle[:,:,None,:] == points[None,None,...])

# `all` check if all the coordinates to be equal,
# `sum` counts the equal points 
mask = compare.all(axis=-1).sum(axis=(-2,-1)) >=2

Triangle[mask]

输出:

array([[[0, 1, 1],
        [1, 0, 1],
        [1, 1, 2]],

       [[1, 2, 3],
        [0, 1, 1],
        [1, 1, 2]],

       [[1, 2, 3],
        [0, 2, 1],
        [0, 1, 1]],

       [[0, 3, 1],
        [0, 2, 1],
        [1, 3, 2]],

       [[0, 2, 1],
        [1, 2, 3],
        [1, 3, 2]],

       [[1, 1, 2],
        [2, 1, 2],
        [2, 2, 1]],

       [[2, 2, 1],
        [1, 2, 3],
        [1, 1, 2]],

       [[2, 3, 1],
        [2, 2, 1],
        [3, 2, 1]],

       [[2, 3, 1],
        [1, 3, 2],
        [1, 2, 3]],

       [[1, 2, 3],
        [2, 2, 1],
        [2, 3, 1]]])

推荐阅读