Добрый день, для моих исследований Я создал клеточный автомат в 2 измерениях. Программа уже запущена, но я все еще пытаюсь ее оптимизировать. Кусок кода ниже суммирует все 8 соседних ячеек центральной ячейки в 2D-массиве. После этого следующая ячейка определяется как функция суммы. Есть ли более быстрый способ, чем 2 для петель?Более эффективный способ суммирования по матрице в numpy/regular python
Прежде, чем я даже имел 4 для петель для суммирования, но это было 2 раз медленнее, чем сейчас ...
n = len(mat1)
m = len(mat1[0])
mat2 = np.zeros((n,m))
sumN = 0
start = time.time()
for i in range(1,n-1):
for j in range(1,m-1):
sumN = mat1[i-1,j-1] + mat1[i-1,j] + mat1[i-1,j+1] + mat1[i,j-1] +mat1[i,j+1] + mat1[i+1,j] + mat1[i+1,j+1]+ mat1[i+1,j-1]
if str(sumN) in B and mat1[i,j] == 0:
mat2[i,j] = 1
elif str(sumN) in S and mat1[i,j] == 1:
mat2[i,j] = 1
sumN = 0
end = time.time()
print end - start
Благодаря хпх, я включил пролонгировать матрицу вместо цикла по всем элементы. После этого я создал логический 2D-массив numpy, который я использую для инициализации следующего поколения.
sumN = sum(np.roll(np.roll(mat1, i, 0), j, 1)
for i in (-1, 0, 1) for j in (-1, 0, 1)
if (i != 0 or j != 0)).flatten()
mat1 = mat1.flatten()
b = np.array(map(lambda x,l: ((int(x) == 0) and (str(int(l)) in B))
or ((int(x) == 1) and (str(int(l)) in S)), mat1,sumN)).reshape(n,m)
mat2 = np.zeros((n,m))
mat2[b] = 1
mat2 = mat2.reshape(n,m)
Я также использовал функцию суммы NumPy над матрицей 3х3 внутри цикла, но это было еще медленнее ... – Noveel
вы можете просто использовать свертку? Например, scipy.signal.convolve2d.with форма вашего ядра? http://docs.scipy.org/doc/scipy-0.16.0/reference/generated/scipy.signal.convolve2d.html – otterb
Какова точка 'str (sumN) в B' и' str (sumN) в S' звонки? Почему вы вычисляете значение, а затем пытаетесь выяснить, находится ли строковое представление числа в 'B' или' S'? Что такое 'B' и' S'? Списки? Строки? Это поможет, поэтому я смогу дать вам ответ. – rayryeng