2016-04-19 3 views
1

Я работаю с триангулированной сеткой, состоящей из точек 3 x n и треугольников, заданных точками индексов 3 x m. Я могу легко построить это, например, используя MLABPython/Numpy: Маска треугольника из точечной маски

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

Я также генерации маски точек маскирования, которые находятся вне границ или nan, так что есть маска размер п. Теперь я хочу замаскировать треугольники, которые имеют замаскированную точку. Мои решения до сих пор:

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, так что «не быстро» - довольно проблема.

Я знаю, что есть ключевое слово mask в mlab, но я не могу заставить его работать. Маскировка только точек в вызове triangular_mesh дает и ошибку, так как t тогда ссылается на индексы, размер которых больше размера p.

ответ

0

Так у вас есть points массив формы (3, n), а triangles массив формы и point_mask булевой массив формы (n,), и хотел бы создать triangle_mask формы (m,) держит True в положении j, если какой-либо из индексов в 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

Угадайте, что это очень похоже на то, что я делал в моем решении loop. Только то, что это в миллион раз быстрее. Отлично работает, спасибо! – Max

Смежные вопросы