1 回答
![?](http://img1.sycdn.imooc.com/5333a01a0001ee5302000200-100-100.jpg)
TA贡献1829条经验 获得超4个赞
使用 numpy 时,做某事的最快方法通常是使用广播或矢量化。您可以在此处阅读有关此内容的更多信息,但基本上这意味着一次将函数应用于数据数组,而不是使用 for 循环遍历数组。
这可能是您在谈论列表理解时所暗示的,但本质上这些只是编写 for 循环的不同方式。
在这种情况下,您要查找的函数是np.cumsum(),axis=0用于指示我们要对每一列进行累积求和。这是一种应用您寻求的逻辑的矢量化方法,并且比您在大型矩阵上的 for 循环解决方案要快得多。
>>> A = np.array([[0,0,0],[4,5,6],[7,8,9],[10,11,12]])
>>> np.cumsum(A, axis=0)
array([[ 0, 0, 0],
[ 4, 5, 6],
[11, 13, 15],
[21, 24, 27]], dtype=int32)
下图显示了随着矩阵大小的增加,这种方法与您问题中的方法的速度比较,这表明矢量化方法的速度往往快大约 10,000 倍。
生成代码:
import perfplot
import numpy as np
def cdjb_cumsum(A):
return np.cumsum(A, axis=0)
def ajbg_forloop(A):
L = np.array(np.zeros((int(len(A)),int(len(A[0])))))
for r in range(0, len(L)):
L[r] = [sum([row[i] for row in A[0:r+1]]) for i in range(0,len(A[0]))]
return L
perfplot.show(
setup=lambda n: np.random.rand(n, n),
n_range=[2**k for k in range(20)],
kernels=[
cdjb_cumsum, ajbg_forloop
],
xlabel='Size of Array (n*n)',
)
添加回答
举报