Python / Numpy:来自点掩码的三角形掩码

Python / Numpy: Triangle mask from point mask

我正在使用由点 3 x n 和点索引 3 x m 指定的三角形组成的三角网格。我可以很容易地绘制它,例如使用 mlab

mesh = mlab.triangular_mesh(p[0,:],p[1,:],p[2,:],t.T

我还生成了一个掩码屏蔽点,这些点超出了范围或 nan,所以我有一个大小为 n 的掩码。现在我想屏蔽具有屏蔽点的三角形。到目前为止我的解决方案:

1:使用掩码将所有被掩码的点变成nan,例如

p[mask] = nan

mlab 然后仍然显示 nan(我需要包括一个阈值过滤器...)实际上我不想弄乱我的数据

2:生成三角形遮罩,我是这样开始的

def triangleMask(triangles, pointmask):
    maskedTris = np.zeros((triangles.shape[1]), dtype=np.bool)
    maskedIdx = np.nonzero(pointmask)[0]
    for i,t in enumerate(triangles.T):
         if (i%5000) == 0:
             print('working it.:', i)
         for p in t:
             if p in maskedIdx:
                 maskedTris[i] = True
                 break

    return maskedTris

这可行,但速度不快。在我的例子中,n = 250.000 和 m = 500.000,所以 "not fast" 是个大问题。

我知道 mlab 中有一个 mask 关键字,但我无法使用它。仅屏蔽 triangular_mesh 调用中的点会产生和错误,因为 t 然后指的是大于 p 大小的索引。

所以你有一个 points 形状数组 (3, n),一个 triangles 形状数组 (3, m) 和一个 point_mask 形状 [=] 布尔数组16=],并且想要创建一个形状为 (m,)triangle_mask,如果 triangles[:, j] 中的任何索引对应于一个 Truepoint_mask 中。您可以通过一些花哨的索引来做到这一点:

triangle_mask = np.any(point_mask[triangles], axis=0)

为了了解发生了什么,point_mask[triangles] 创建了一个形状为 (3, m) 的布尔数组,位置 (i, j) 的值为 point_mask[triangles[i, j]].