python - numpy数组遍历的优化

标签 python performance numpy optimization multidimensional-array

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/

相关文章:

python - 如何解析 json 数据 python django?

css - 浏览器一直在下载 CSS 背景图片

python - 在Python中绘制条形图

python - 识别在特定分位数 : data science pandas 中的观察

python - 重复的 numpy 子数组

python - Eurostat 的 pandas 数据挖掘

python - 如何避免在 Postgresql 的 INSERT 期间显式转换 NULL

python - 如何以 Python 方式修复字典中的默认值?

php - xdebug,分析器输出有问题

Python优化如何在列表中查找重复值和值索引