Подход № 1
Мы можем использовать 2D convolution
, чтобы решить его с соответствующим ядром ([1,1,1])
или ([1,0,1])
на маске zeros
и ищите, чтобы свертки суммировались как >=1
, что сигнализирует по крайней мере один ноль в каждом скользящем окне из трех элементов и с дополнительной проверкой того, что текущий элемент ненулевой, подтверждает, что есть по крайней мере один соседний 0
.
Реализация будет выглядеть примерно так -
In [245]: a # input array
Out[245]:
array([[1, 1, 0, 0, 0, 0, 0, 0, 1, 0],
[1, 1, 0, 0, 0, 0, 0, 1, 1, 1],
[0, 1, 1, 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, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
In [246]: from scipy.signal import convolve2d
In [248]: k = [[1,1,1]] # kernel for convolution
In [249]: ((convolve2d(a==0,k,'same')>=1) & (a!=0)).sum()
Out[249]: 12
Подход № 2
Другой подход будет использовать slicing
, как мыищите одноразовые смещенные элементы вдоль каждой строки для совпадений нулей и ненулей для левой и правой сторон LHS
и RHS
и, наконец, суммируйте их -
maskRHS = (a[:,1:]==0) & (a[:,:-1]!=0)
maskLHS = (a[:,1:]!=0) & (a[:,:-1]==0)
maskRHS[:,1:] |= maskLHS[:,:-1]
out = maskRHS.sum() + maskLHS[:,-1].sum()