Переход от вложенных циклов к NumPy итерации - PullRequest
0 голосов
/ 18 июня 2020

У меня есть система уравнений, которую я пытаюсь смоделировать, и использование очень простых 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 в более эффективную схему итераций?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...