Выпуклая оболочка заданного значения внутри массива numpy-python 2.7


Для данного массива (как показано ниже) и заданного значения (здесь 0), я хотел бы подсчитать, сколько 0 может быть ассоциировано с одной и той же выпуклой оболочкой.

Массив:

1 2 4 5 8 9 7
4 0 0 7 5 6 8
6 5 0 4 3 5 2
1 0 0 5 7 0 6
2 3 5 7 8 9 4

Для предложенного массива решение должно получить : [5, 1], поскольку первый "шаблон" из пяти 0 может быть идентифицирован между второй и четвертой строками и вторым/третьим столбцами. Существует второй паттерн только с одним 0.

У вас есть какие-нибудь идеи о том, как это сделать ? Я знаю, как считать число 0. Может быть, я могу что-то сделать с опцией маски массива numpy ?

С наилучшими пожеланиями и спасибо за вашу помощь,

1 2

1 ответ:

То, что вы ищете, - это "связанные компоненты" в массиве. Scipy имеет удобную функцию label для этого:

import numpy as np
from scipy.ndimage.measurements import label

a = np.array([
    [1, 2, 4, 5, 8, 9, 7],
    [4, 0, 0, 7, 5, 6, 8],
    [6, 5, 0, 4, 3, 5, 2],
    [1, 0, 0, 5, 7, 0, 6],
    [2, 3, 5, 7, 8, 9, 4],])

labs, n_components = label(a==0)

component_sizes = [np.sum(labs==i) for i in range(1, n_components+1)]

print(component_sizes)

Отпечатки [5, 1]