Comentários?
def espalhe(tab, viz): # calcule instáveis: posições com 0 não são instáveis instaveis = (tab >= viz) & (tab > 0) # remova grãos a serem espalhados tab[instaveis] -= viz[instaveis] # espalhe: usa o fato do valor de True ser 1 e False ser 0 tab[1:-1,1:-1] += ( instaveis[1:-1, :-2] # espalha para direita + instaveis[1:-1, 2: ] # espalha para esquerda + instaveis[2: , 1:-1] # espalha para cima + instaveis[ :-2, 1:-1] ) # espalha para baixo