尝试将for循环转换为numpy矩阵运算

u0sqgete  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(174)

这是一个有点奇怪的问题,但我试图通过失去for循环并依赖numpy操作来改善代码的运行时间。我仍然是处理numpy矩阵操作的初学者,我似乎无法正确翻译这一点。

for i in range (Ma):

    for j in range (Na):
    
        for h in range(Mt):
        
            for k in range(Nt):

                dx = xrfa[i] - xrft[h]
                dy = yrfa[j] - yrft[k] 

                Wat[i,j,h,k] = at * np.exp(- ((np.square(dx) + np.square(dy))/ (2  * np.square(sigat)

任何帮助将不胜感激。我特别挣扎与dx和dy。

sg2wtvxw

sg2wtvxw1#

依靠broadcasting的力量!
设置:

import numpy as np

Ma, Na, Mt, Nt = 2, 3, 4, 5

# Assuming these are all just 1D arrays
xrfa = np.arange(Ma)
yrfa = np.arange(Na)
xrft = np.arange(Mt)
yrft = np.arange(Nt)

# and these scalars:
at = 2
sigat = 3

你可以(ab)使用np.ix_来引入单例维度,但我将在这里显式地做:

xrfa = xrfa[:, None, None, None]
yrfa = yrfa[None, :, None, None]
xrft = xrft[None, None, :, None]
yrft = yrft[None, None, None, :]

现在你的数组都广播到(Ma, Na, Mt, Nt)的形状,此时你可以使用一行程序来进行所有的计算(希望我正确地修复了你的括号):

Wat = at * np.exp(-(np.square(xrfa - xrft) + np.square(yrfa - yrft)) / (2  * np.square(sigat)))

相关问题