Подсчет "колодцев" в матовой двумерной матрице - PullRequest
1 голос
/ 29 марта 2019

Учитывая двумерную матрицу 1 с и 0, например, для -

array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 1, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 1, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 1, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 1, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
       [0, 1, 1, 0, 0, 1, 0, 1, 0, 1],
       [1, 1, 0, 0, 1, 1, 0, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 0, 1, 0, 0],
       [1, 0, 0, 0, 1, 0, 1, 1, 0, 0],
       [1, 0, 0, 0, 1, 0, 1, 1, 1, 0],
       [1, 0, 0, 0, 1, 1, 0, 1, 1, 0]])

1 обозначает блок, а 0 обозначает пустой пробел. Я хочу рассчитать количество скважин и их суммарную глубину .

Скважина существует, когда столбец короче, чем оба соседних столбца, предполагается, что границы заполнены блоками (1 с). Например, для заполнения границ массив становится:

array([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1],
       [1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1],
       [1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1],
       [1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1],
       [1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1],
       [1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1],
       [1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1],
       [1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1],
       [1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1],
       [1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1],
       [1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1]])
  • Количество скважин составляет 3 ( Столбец 1, 4 и (9,10) ).

  • Глубина скважины min(height(col_to_left), height(col_to_right)) - height(well_col).
    Таким образом, в этом случае глубина составляет [1, 1, 7] . И поэтому накопленная глубина составляет 1 + 1 + 7 = 9 .

Как мне найти это? Я хочу избежать использования петель.

1 Ответ

0 голосов
/ 29 марта 2019

Вы можете использовать argmax, чтобы получить позиции первой в каждом столбце.

# find absolute depths
d = X.argmax(0)
# correct columns that are all zero
v = np.take_along_axis(X, d[None], 0)
d[v[0]==0] = len(X)
# pad and compute the col to next col changes
d = np.diff(np.concatenate([[0], d, [0]]))
# exclude no change
chng, = np.where(d)
# find down changes
dwn = d[chng]>0
# wells are where we go down and the next non zero change is up
well = dwn[:-1]&~dwn[1:]
# map back to unfiltered indices for left and right walls
l, r = chng[:-1][well], chng[1:][well]
wells = np.c_[l+1, r]
wells
# array([[ 1,  1],
#       [ 4,  4],
#       [ 9, 10]])
# retrieve relative depths
depths = np.minimum(d[l], -d[r])
depths
# array([1, 1, 7])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...