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]
中的任何索引对应于一个 True
在 point_mask
中。您可以通过一些花哨的索引来做到这一点:
triangle_mask = np.any(point_mask[triangles], axis=0)
为了了解发生了什么,point_mask[triangles]
创建了一个形状为 (3, m)
的布尔数组,位置 (i, j)
的值为 point_mask[triangles[i, j]]
.
我正在使用由点 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]
中的任何索引对应于一个 True
在 point_mask
中。您可以通过一些花哨的索引来做到这一点:
triangle_mask = np.any(point_mask[triangles], axis=0)
为了了解发生了什么,point_mask[triangles]
创建了一个形状为 (3, m)
的布尔数组,位置 (i, j)
的值为 point_mask[triangles[i, j]]
.