我有以下代码:
import numpy as np
epsilon = np.array([[0. , 0.00172667, 0.00071437, 0.00091779, 0.00154501],
[0.00128983, 0. , 0.00028139, 0.00215905, 0.00094862],
[0.00035811, 0.00018714, 0. , 0.00029365, 0.00036993],
[0.00035631, 0.00112175, 0.00022906, 0. , 0.00291149],
[0.00021527, 0.00017653, 0.00010341, 0.00104458, 0. ]])
Sii = np.array([19998169., 14998140., 9997923., 7798321., 2797958.])
n = len(Sii)
epsilonijSjj = np.zeros((n,n))
for i in range(n):
for j in range(n):
epsilonijSjj[i,j] = epsilon[i][j]*Sii[j]
print (epsilonijSjj)
如何避免双重 for 循环并以快速的 Python 方式编写代码?
提前谢谢您
可以在 numpy 中使用向量化操作来避免 for 循环,这会高效得多。numpy 数组能够进行逐元素乘法,这正是所需要的。
import numpy as np
epsilon = np.array([[0. , 0.00172667, 0.00071437, 0.00091779, 0.00154501],
[0.00128983, 0. , 0.00028139, 0.00215905, 0.00094862],
[0.00035811, 0.00018714, 0. , 0.00029365, 0.00036993],
[0.00035631, 0.00112175, 0.00022906, 0. , 0.00291149],
[0.00021527, 0.00017653, 0.00010341, 0.00104458, 0. ]])
Sii = np.array([19998169., 14998140., 9997923., 7798321., 2797958.])
epsilonijSjj = epsilon * Sii[:, None]
print(epsilonijSjj)
在这个解决方案中,我们利用了以下内容:
-
广播:
当我们将一个 (5,) 形状的数组
Sii
与一个 (5, 5) 形状的数组epsilon
相乘时,numpy 会“广播”Sii
以匹配epsilon
的形状,本质上是将Sii
复制为epsilon
中的每一行。 -
逐元素乘法:
*
运算符对epsilon
和广播的Sii
数组执行逐元素乘法,产生所需的输出。
这种方法比使用嵌套循环要快得多,尤其是对于大型数组而言,因为它利用了 numpy 的优化矩阵运算。
标签:python,numpy,performance,for-loop,vectorization From: 71327868