import numpy as np
T = True
F = False
a = np.array([[T,T,T,F],[T,F,T,T],[T,T,T,T]])
a[1:-1, 1:-1] |= (a[:-2, :-2] & a[:-2, 1:-1] & a[:-2, 2:] &
a[1:-1, :-2] & a[1:-1, 2:] &
a[2:, :-2] & a[2:, 1:-1] & a[2:, 2:])
print(a)
дает:
[[ True True True False]
[ True True True True]
[ True True True True]]
Или, если под словом «окруженный» вы просто подразумеваете четыре элемента, которые непосредственно смежны (не смежные по диагонали), тогда выражение становится:
a[1:-1, 1:-1] |= ( a[ :-2, 1:-1] &
a[1:-1, :-2] & a[1:-1, 2:] &
a[2:, 1:-1] )
, возможно, лучше записать как:
a[1:-1, 1:-1] |= (a[:-2, 1:-1] & a[1:-1, :-2] & a[1:-1, 2:] & a[2:, 1:-1])
И результат для этого конкретного примера массива такой же, как и раньше.