gpt4 book ai didi

python - numpy数组遍历的优化

转载 作者:行者123 更新时间:2023-12-01 03:27:38 25 4
gpt4 key购买 nike

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<分别为/strong>、floatnumpy.ndarray

3. 对于 nyTesnzTes 重复上面的完整 block ,即在主算法循环中总共完成了三个 block 。目标是使用来自 xcTes

的位置数据创建一个窗口大小为 dtaCri 且中心位于比较点 xCom 的感兴趣区域

4. 上面的代码或多或少是从 Matlab 直接移植的,其中相同的 block 以大约三到四倍的速度执行。

<强>5。问题:是否可以在执行时间方面优化上面的 block ,如果可以,如何优化?

6. 到目前为止,我已经尝试了一些小的调整,例如更改数据类型和使用 range() 而不是 xrange()我没有看到性能有明显变化。

最佳答案

在以矢量化方式进入循环并使用切片之前预先计算这些 bool 条件输出,这只是输入数组的 View ,就像这样 -

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

然后,只需在循环中使用这些 bool 值 -

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

这个想法是在循环内做最少的工作,重点关注性能。

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

关于python - numpy数组遍历的优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41271695/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com