Это довольно просто организовать с NumPy .Функция np.roll возвращает копию массива, «свернутого» в указанном направлении.
Например, учитывая массив x
,
x=np.arange(9).reshape(3,3)
# array([[0, 1, 2],
# [3, 4, 5],
# [6, 7, 8]])
, вы можете свернуть столбцы вправо с помощью
np.roll(x,shift=1,axis=1)
# array([[2, 0, 1],
# [5, 3, 4],
# [8, 6, 7]])
Используя np.roll, границы будутзавернутый как на торе.Если вам не нужны обернутые границы, вы можете заполнить массив ребром нулей и обнулять ребро перед каждой итерацией.
import numpy as np
def diffusion(arr):
while True:
arr+=0.2*np.roll(arr,shift=1,axis=1) # right
arr+=0.2*np.roll(arr,shift=-1,axis=1) # left
arr+=0.2*np.roll(arr,shift=1,axis=0) # down
arr+=0.2*np.roll(arr,shift=-1,axis=0) # up
yield arr
N=5
initial=np.random.random((N,N))
for state in diffusion(initial):
print(state)
raw_input()