Есть ли более быстрый способ, чем этот код numpy, для поиска уникальных смежных пар в 2D-массиве?

#python #numpy #optimization

Вопрос:

У меня есть 2D массив numpy, представляющий маску сегментации биологических клеток. Другими словами, этот массив указывает пиксели на отдельном изображении 2D-микроскопа, которые принадлежат разным ячейкам, поэтому везде, где в массиве появляется «1», эти позиции на изображении являются частью с идентификатором 1, где появляется «2», они принадлежат идентификатору ячейки 2 и т. Д. Когда есть 0, в этой части изображения нет ячейки. Я хочу найти ячейки, которые находятся рядом друг с другом. Я придумал код ниже, но мне интересно, есть ли более быстрый способ сделать это, так как мне нужно запустить это в цикле для сотен масок, и в настоящее время это занимает в общей сложности несколько часов с этим решением:

 #Get the horizontal adjacent pairs
v = mask.flatten()
x = np.column_stack([v[:-1], v[1:]])
#Get the vertical adjacent pairs
v = mask.T.flatten()
y = np.column_stack([v[:-1], v[1:]])
#Just keep unique pairs
pairs = np.unique(np.vstack([x, y]), axis=0)
#Drop pairs with no cell or the same cell
pairs[(pairs[:,0] != 0) amp; (pairs[:,1] != 0) amp; (pairs[:,0] != pairs[:,1])]
 

Редактировать: Я только что понял, что этот код даже неверен, так как использование выравнивания приведет к тому, что ячейки на одной границе будут соседствовать с ячейками на противоположной границе.

Комментарии:

1. Итак, вы ищете переходы типа 11111122222, в которых нет промежуточных нулей? А как насчет вертикальных смежностей?

2. Да, именно так. Из этого примера я хотел бы получить пару (1, 2). Также необходимо учитывать вертикальные смежности.

3. Вы можете добавить границу 0 вокруг своего изображения. Это решило бы общую проблему.