У меня есть модель CA, похожая на модель игры жизни Конвея. Однако в этом случае я хочу создать функцию, которая способна вычислять окрестности масштабируемым образом, то есть всех соседей в данном «радиусе», используя тороидальную поверхность. Мне удалось собрать подобную функцию, используя np.roll ():
def NBtorus(X, r = 1):
#X - np.array, r - Moore neighborhood radius
a=np.arange(-1*r, r+1)
district=itertools.product(a, a)
N=np.sum(np.roll(np.roll(X, pac[1], axis=0), pac[0], axis=1) for pac in district)
return N
Это работает просто отлично. Тем не менее, я боюсь, что во всей моей симуляции главное узкое место - петля for
(все остальное векторизовано). Есть ли более разумный способ для этого?