带嵌套循环的二维数组的计算与构造

Calculation and construction of two dimensional array with nested loop

我正在尝试用 Python 进行计算。我想生成一个带有嵌套循环的 20*20 数组。我不知道我的方向是否正确,但这是我的代码:

w = 1.5
m = 0.556
E = np.linspace(15.4, 4.0, num=20)
u = np.linspace(0.29, 0.79, num=20)
Q = 0

for j in E:
    for i in u:
        Q = E * ( m / 1 + m ) * (1 - (w**2)/((w + u)**2)),

print Q        

循环不产生 20*20 数组。我怎样才能让它正常工作?

您似乎希望 Q 成为最终的 20x20 数组。 Numpy 的一个关键点是您应该尽可能避免 for 循环,因为它们比矢量化数组操作慢得多。从 Eu.

构建二维数组有更快的方法

代码中的主要问题是 Q = E * ( m / 1 + m ) * (1 - (w**2)/((w + u)**2)) 行实际上只是将两个长度为 20 的数组按元素相乘 400 次,每次生成相同长度的 20 数组 Q

也就是说,我们有两个长度为20的数组:

>>> (E *  ( m / 1 + m ))
array([ 17.1248,  16.4576,  15.7904,  15.1232,  14.456 ,  13.7888,
        13.1216,  12.4544,  11.7872,  11.12  ,  10.4528,   9.7856,
         9.1184,   8.4512,   7.784 ,   7.1168,   6.4496,   5.7824,
         5.1152,   4.448 ])

>>> (1 - (w**2)/((w + u)**2))
array([ 0.29777473,  0.31797577,  0.33731751,  0.35584798,  0.37361193,
        0.39065107,  0.40700429,  0.42270793,  0.43779594,  0.45230007,
        0.46625008,  0.47967384,  0.49259748,  0.50504555,  0.51704109,
        0.52860578,  0.53976   ,  0.55052296,  0.56091274,  0.5709464 ])

并将它们逐元素乘以 * 只会产生这个:

>>> E * ( m / 1 + m ) * (1 - (w**2)/((w + u)**2))
array([ 5.09933263,  5.2331181 ,  5.32637834,  5.38156012,  5.40093407,
        5.38660945,  5.34054752,  5.26457365,  5.16038825,  5.02957682,
        4.87361888,  4.69389633,  4.49170089,  4.26824095,  4.02464786,
        3.76198161,  3.48123612,  3.18334398,  2.86918086,  2.53956957])

相反,要将这两个长度为 20 的数组转换为所需的 20x20 数组,您可以使用以下矢量化操作替换 for 循环:

>>> np.multiply.outer((E * ( m / 1 + m )), (1 - (w**2)/((w + u)**2)))
# the 20x20 array

此处使用 multiply ufunc 的 outer 方法创建新的 20x20 数组。