У меня есть система уравнений, которую я пытаюсь смоделировать, и использование очень простых c циклических структур, похоже, быстро замедляет скорость моих вычислений. У меня есть фиктивный пример ниже, чтобы проиллюстрировать, как я запускаю моделирование сейчас:
import numpy as np
Imax, Jmax, Tmax = 4, 4, 3
Iset, Jset, Tset = range(0,Imax), range(0,Jmax), range(0,Tmax)
X = np.arange(0,48).reshape(3,4,4)
X[1], X[2] = 4, 2
Y = 2*X
for t in Tset:
if t == 2:
break
else:
for i in Iset:
for j in Jset:
Y[t+1,i,j] = Y[t,i,j] + X[t,i,j]
X[t+1,i,j] = X[t,i,j] + 1
# Output for Y...
array([[[ 0, 2, 4, 6],
[ 8, 10, 12, 14],
[16, 18, 20, 22],
[24, 26, 28, 30]],
[[ 0, 3, 6, 9],
[12, 15, 18, 21],
[24, 27, 30, 33],
[36, 39, 42, 45]],
[[ 1, 5, 9, 13],
[17, 21, 25, 29],
[33, 37, 41, 45],
[49, 53, 57, 61]]])
Интуитивно эта структура имеет для меня смысл, потому что я получаю доступ к отдельным элементам массива Y
и обновляю его, но поскольку у меня есть этот цикл для очень больших значений и больше происходит в l oop, я испытываю резкое c снижение скорости вычислений.
Я наткнулся на nditer
и надеюсь, что смогу использовать его вместо нескольких вложенных циклов, которые у меня есть, чтобы я мог получить тот же результат, но быстрее. Как я могу go преобразовать этот вложенный стиль for-l oop в более эффективную схему итераций?