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

时间:2015-01-05 12:16:53

标签: python arrays numpy

我正在尝试使用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阵列。我怎样才能让它正常工作?

1 个答案:

答案 0 :(得分:5)

您希望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

此处outer ufunc的multiply方法用于创建新的20x20阵列。