具有嵌套循环的二维数组的计算和构造



我正在尝试用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构建 2D 阵列。

代码中的主要问题是行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 数组。

最新更新