Векторизованное решение с использованием открытых сеток
Мы могли бы использовать два открытых массива диапазона / сетки для N
, имитирующих то же поведение, что и итераторы -
I = np.arange(N)
mask = (I[:,None] - c)**2 + (I - c)**2 < r_0**2/dh2
out = np.where(mask,phi_0,0)
Для общего диапазона в двух циклах
Для общего случая, когда мы будем повторять два цикла, которые продолжаются до, скажем, M
и N
соответственно, мы можем использовать np.ogrid
для создания этих открытых сеток и последующего использования в тех же строках -
I,J = np.ogrid[:M,:N]
mask = (I - c)**2 + (J - c)**2 < r_0**2/dh2
Для общего числа циклов
Дляобщее число циклов, просто создайте столько переменных, сколько число циклов.Следовательно, для трех циклов:
for i in range(M):
for j in range(N):
for k in range(P):
, мы бы имели:
I,J,K = np.ogrid[:M,:N,:P]
, затем использовали бы I,J,K
вместо i,j,k
соответственно для поэлементных операций, как у нас здесь.
Альтернатива для замены последнего шага для этого конкретного случая
Последний шаг также может быть реализован с поэлементным умножением путем масштабирования до phi_0
с mask
в качестве части else
устанавливается значение 0s
-
out = mask*phi_0