Я работаю с триангулированной сеткой, состоящей из точек 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.
Угадайте, что это очень похоже на то, что я делал в моем решении loop. Только то, что это в миллион раз быстрее. Отлично работает, спасибо! – Max