python循环生成二维数组_嵌套循环二维数组的计算与构造 - python

我正在尝试使用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数组。如何使它正常工作?

python大神给出的解决方案

您似乎希望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数组。

你可能感兴趣的:(python循环生成二维数组)