Python / Numpy:点掩码中的三角遮罩

时间:2016-04-19 07:02:26

标签: python numpy matplotlib mayavi

我正在使用由点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的大小的索引。

1 个答案:

答案 0 :(得分:0)

所以你有一个points形状的数组(3, n),一个形状为triangles的{​​{1}}数组和一个形状为(3, m)的{​​{1}}布尔数组如果point_mask中的任何索引对应于{{1},则希望在(n,)位置创建triangle_mask形状(m,) Truej中。你可以通过一些花哨的索引来做到这一点:

triangles[:, j]

要了解正在发生的事情,True会创建一个形状为point_mask的布尔数组,位置triangle_mask = np.any(point_mask[triangles], axis=0) 的值为point_mask[triangles]