numpy数组遍历的优化

2024-06-01 03:00:06 发布

您现在位置:Python中文网/ 问答频道 /正文

1.考虑以下对numpy.ndarray公司

for ii in xrange(0,(nxTes-2)):
    if ( (xCom-dtaCri-xcTes[ii]) * (xCom-dtaCri-xcTes[ii+1]) ) <= 0.0:
        nxL=ii
    if ( (xCom+dtaCri-xcTes[ii]) * (xCom+dtaCri-xcTes[ii+1]) ) <= 0.0:
        nxR=ii+1

2.xComdtaCrixcTes类型为()numpy.float64个浮动numpy.ndarray公司分别

3.nyTesnzTes中重复上面的完整块,即在主算法循环中总共完成三个块。目标是使用来自xcTes的位置数据创建一个窗口大小为dtaCri、中心位于比较点xCom的感兴趣区域

4.以上代码或多或少是Matlab的一个直接端口,其中相同的块以大约3到4倍的速度执行。你知道吗

5岁。问题:是否有可能在执行时间方面优化上面的块?如果有,如何优化?你知道吗

6.到目前为止,我尝试了一些小的调整,比如改变数据类型,使用range()而不是xrange(),从中我没有看到性能上的明显变化。你知道吗


Tags: innumpy类型forif公司iindarray
1条回答
网友
1楼 · 发布于 2024-06-01 03:00:06

在以矢量化的方式进入循环并使用切片之前,预先计算这些布尔条件输出,这些切片只是输入数组中的视图,如下-

parte1 = ( (xCom-dtaCri-xcTes[:nxTes-2]) * (xCom-dtaCri-xcTes[1:nxTes-1]) ) <=0.0
parte2 = ( (xCom+dtaCri-xcTes[:nxTes-2]) * (xCom+dtaCri-xcTes[1:nxTes-1]) ) <=0.0

我们可以看到很少有重复的计算。所以,我们可以在那里重新使用-

p = xCom-xcTes[:nxTes-1]
p0 = p - dtaCri
p1 = p + dtaCri
parte1 = p0[:-1]*p0[1:] <= 0.0
parte2 = p1[:-1]*p1[1:] <= 0.0

然后,就用那些胸部在循环-

for ii in xrange(0,(nxTes-2)):
    if parte1[ii]:
        nxL=ii
    if parte2[ii]:
        nxR=ii+1

这样做的目的是在循环内部做最少的工作,并将重点放在性能上。你知道吗

我假设在使用nxLnxR的循环中有更多的工作要做,否则我们会将值覆盖到这两个变量中。你知道吗

相关问题 更多 >