2012-02-25 3 views
10

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

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

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 version того, что я прошу.

ответ

14

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

labels, numL = label(array) 
label_indices = [(labels == i).nonzero() for i in xrange(1, numL+1)] 
Смежные вопросы