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



我正在使用一个三角网格,该网格由点 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,因此"不快"是一个很大的问题。

我知道mlab中有一个掩码关键字,但我无法让它工作。仅屏蔽triangular_mesh调用中的点会产生和误差,因为 t 是指大于 p 大小的索引。

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

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

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

相关内容

  • 没有找到相关文章

最新更新