【问题标题】:Python / Numpy: Triangle mask from point maskPython / Numpy:点掩码的三角形掩码
【发布时间】:2016-04-19 07:02:26
【问题描述】:

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

【问题讨论】:

    标签: python numpy matplotlib mayavi


    【解决方案1】:

    所以你有一个points 形状数组(3, n)、一个triangles 形状数组(3, m) 和一个point_mask 布尔数组形状(n,),并想创建一个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]]

    【讨论】:

    • 猜猜这与我在循环解决方案中所做的非常相似。只是它快了一百万倍。效果很好,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-05-19
    • 2021-02-25
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 2020-05-24
    相关资源
    最近更新 更多