O problema consiste em modelar a propagação de um sinal (por exemplo, luz ou som etc.) através de uma série de obstáculos, como na figura abaixo. O sinal não pode passar pela superfície inferior (terreno), mas pode atravessar obstáculos. Eu quero contar o número de obstáculos atravessados.
Terreno e obstáculos estão em matrizes numpy 2D (x, y, z). Isto é o que eu faço:
output = numpy.zeros(terrain.shape)
obstacles = terrain + obstacle_heights
for i in xrange (obstacles.shape[0]):
for j in xrange (obstacles.shape[1]):
mask = obstacles[i,j] > terrain[i,j:]
output[i,j:][mask] +=1
O resultado seria algo como [0, 0, 0, 1, 1, 1, 2, 3, 4, 4, 4 ...]
por linha.
Este método funciona bem (desde que os vales no terreno sejam preenchidos usando numpy.maximum.accumulate
). Agora, seria possível acelerar a coisa usando uma solução vetorizada?