2016-04-19 17 views
1

ポイントインデックス3 x mで指定されたポイント3 x nと三角形からなる三角メッシュで作業しています。私はそれを簡単にプロットすることができます。私はまた、範囲外又はnanであるマスクマスキング点を生成していますので、私はマスクNのサイズを有するMLABPython/Numpy:ポイントマスクからのトライアングルマスク

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

を使用。今私はマスクされた点を持つ三角形をマスクしたい。これまでの私の解決策:

1:すべてのマスクされたポイントをnanに変えます。

p[mask] = nan 

mlabその後、まだnanを示し(Iがしきい値フィルタを含める必要があるだろう...)と私は実際に私のデータ

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のサイズよりも大きいインデックスを参照するため、yieldとerrorが返されます。

答えて

0

ですから、形状(3, n)points配列、形状のtriangles配列や形状(n,)point_maskブール配列を持ち、かつ指標のいずれかであれば位置jTrueを保持する形状(m,)triangle_maskを作成したいですtriangles[:, j]は、Trueに対応し、point_maskに対応する。あなたはファンシーインデックスの少しであることを行うことができます。

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

何が起こっているかを理解するために、point_mask[triangles]位置(i, j)の値がpoint_mask[triangles[i, j]]ことで、形状のブール配列を作成します。

+0

私のループソリューションで行っていたこととまったく同じことを推測します。その100万回の速度がそれだけです。素晴らしい作品です、ありがとう! – Max

関連する問題