我正在尝试使用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阵列。我怎样才能让它正常工作?
答案 0 :(得分:5)
您希望Q
成为最终的20x20阵列。 Numpy的一个关键点是你应该尽可能避免for
循环,因为它们比矢量化数组操作要慢得多。有更快的方法可以从E
和u
构建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阵列。