2016-04-19 19 views
1

Ich arbeite mit einem triangulierten Netz, das aus Punkten 3 x n und Dreiecken besteht, die durch die Punktindizes 3 x m angegeben werden. Ich kann das z.B. mit MLabPython/Numpy: Dreiecksmaske von Punktmaske

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

ich auch eine Maske Maskierung Punkte bin zu erzeugen, die außerhalb der Grenzen oder nan sind, so habe ich eine Maske, um die Größe von n. Jetzt möchte ich die Dreiecke maskieren, die einen maskierten Punkt haben. Meine Lösungen bisher:

1: Verwenden Sie die Maske, um alle maskierten Punkte in nan, z.

p[mask] = nan 

mlab zeigt dann noch nan (ich würde einen Schwellenwert Filter enthalten müssen ...) und ich will eigentlich nicht zu verwirren mit meinen Daten

2: ein Dreieck Maske generieren, die begann ich wie diese

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 

Dies funktioniert, aber nicht schnell. Und in meinem Fall, n = 250.000 und m = 500.000, ist "nicht schnell" ein ziemliches Problem.

Ich weiß, dass es ein Maskenschlüsselwort in mlab gibt, aber ich kann es nicht zum Funktionieren bringen. Maskieren nur die Punkte in den dreieckigen_mesh-Aufruf-Erträgen und Fehlern, da sich t dann auf Indizes bezieht, die größer sind als die Größe von p.

Antwort

0

So haben Sie eine points Array von Form (3, n), eine triangles Anordnung von Form und ein point_mask boolean Array von Form (n,), und möchten ein triangle_mask Form (m,) halten True an Position erstellen j, wenn eine der Indizes in triangles[:, j] entspricht einem True in point_mask. Sie können mit einem wenig Phantasie Indizierung zu tun:

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

Um zu verstehen, was los ist, point_mask[triangles] schafft einen boolean-Array von Form , wobei der Wert an der Position (i, j)point_mask[triangles[i, j]] zu sein.

+0

Vermutung, das ist ziemlich ähnlich zu dem, was ich in meinem Loop-Lösung tat. Nur dass es eine Million mal schneller ist. Funktioniert super, danke! – Max