我发现了一个小的代码片段,它曾经是一个双for循环,我通过矢量化把它变成了一个单for循环。完成这项工作后,时间有了很大的提高,所以我想知道是否有可能通过矢量化消除第二个for循环,以及它是否会提高性能
import numpy as np
from timeit import default_timer as timer
nlin, npix = 478, 480
bb = np.random.rand(nlin,npix)
slope = -8
fac = 4
offset= 0
barray = np.zeros([2,2259]);
timex = timer()
for y in range(nlin):
for x in range(npix):
ling=(np.ceil((x-y/slope)*fac)+1-offset).astype(np.int);
barray[0,ling] +=1;
barray[1,ling] +=bb[y,x];
newVar = np.copy(barray)
print(timer() - timex)
因此,通过创建以下矩阵,可以将ling从循环中取出
lingMat = (np.ceil((np.vstack(npixrange)-nlinrange/slope)*fac)+1-offset).astype(np.int);
它满足lingMat[x,y]=“x和y处for循环中的ling”。这是矢量化的第一步
在矢量化方面,您可能会使用基于np.add.at的东西:
但是,我建议您直接使用numba,使用带有选项
nopython=True
的@jit
decorator对其进行优化,这将为您提供:让我们检查输出
现在这些时间
产生的优化函数比最初的2个循环版本快得多,比
np.add.at
版本快得多。希望这有帮助相关问题 更多 >
编程相关推荐