Определить смежные области в массиве 2D numpy

У меня есть большой массив numpy, на который я применил фильтр. Я хотел бы идентифицировать смежные области в этом масках. Здесь я определяю область, которая должна быть смежной, если для любого индекса (x1,y1) для любого другого индекса (x2,y2) они принадлежат к одной и той же области, если есть путь к значениям True вдоль равных целых шагов вдоль осей ( диагонали являются действительными шагами).

Это может быть не так ясно, как простая картина. С учетом маски:

0010000
0100000
0110000
0000011
1000010

Должны быть определены три области, так что вывод будет похож на

[ [[0,2],[1,1],[2,1],[2,2]], [[3,5],[3,6],[4,5]], [[4,0]] ]

Я хотел бы использовать что-то встроенное в numpy, не прибегая к написанию моего собственного алгоритма Flood Fill. Немногие исследования в документах только показали 1D версию того, что я прошу.

Ответ 1

Вы ищете scipy.ndimage.label, подробнее здесь. label возвращает массив той же формы, что и вход, где каждая "уникальная функция имеет уникальное значение", поэтому, если вам нужны индексы функций, вы можете сделать что-то вроде:

labels, numL = label(array)
label_indices = [(labels == i).nonzero() for i in xrange(1, numL+1)]