Определить смежные области в двумерном массиве - PullRequest
12 голосов
/ 25 февраля 2012

У меня есть большой массив 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 Ответ

17 голосов
/ 25 февраля 2012

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

labels, numL = label(array)
label_indices = [(labels == i).nonzero() for i in xrange(1, numL+1)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...