带嵌套循环的二维数组的计算与构造
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
循环,因为它们比矢量化数组操作慢得多。从 E
和 u
.
构建二维数组有更快的方法
代码中的主要问题是 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 数组。
我正在尝试用 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
循环,因为它们比矢量化数组操作慢得多。从 E
和 u
.
代码中的主要问题是 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 数组。