当前位置: 首页 > 面试题库 >

提高代码效率:滑动窗口上的标准偏差

慎志国
2023-03-14
问题内容

我正在尝试改善为图像的每个像素计算位于像素附近的像素的标准偏差的功能。我的函数使用两个嵌入式循环在整个矩阵中运行,这是我程序的瓶颈。我猜有可能通过摆脱numpy摆脱循环来改善它,但是我不知道如何进行。欢迎任何建议!

问候

def sliding_std_dev(image_original,radius=5) :
    height, width = image_original.shape
    result = np.zeros_like(image_original) # initialize the output matrix
    hgt = range(radius,height-radius)
    wdt = range(radius,width-radius)
    for i in hgt:
        for j in wdt:
            result[i,j] = np.std(image_original[i-radius:i+radius,j-radius:j+radius])
    return result

问题答案:

绝妙的技巧:您可以仅在平方值和窗口中的值总和下计算标准偏差。

因此,您可以对数据使用统一滤波器来非常快速地计算标准偏差:

from scipy.ndimage.filters import uniform_filter

def window_stdev(arr, radius):
    c1 = uniform_filter(arr, radius*2, mode='constant', origin=-radius)
    c2 = uniform_filter(arr*arr, radius*2, mode='constant', origin=-radius)
    return ((c2 - c1*c1)**.5)[:-radius*2+1,:-radius*2+1]

这是 可笑的 比原来的功能更快。对于1024x1024阵列且半径为20的情况,旧功能需要34.11秒,新功能需要 0.11秒 ,加速300倍。

这在数学上如何工作?它计算sqrt(mean(x^2) - mean(x)^2)每个窗口的数量。我们可以从标准偏差中得出以下数量sqrt(mean((x - mean(x))^2))

让我们E成为期望操作符(基本上是mean()),并X成为数据的随机变量。然后:

E[(X - E[X])^2]
= E[X^2 - 2X*E[X] + E[X]^2]
= E[X^2] - E[2X*E[X]] + E[E[X]^2](通过期望运算符的线性)
= E[X^2] - 2E[X]*E[X] + E[X]^2(再次通过线性和E[X]为常数的事实)
= E[X^2] - E[X]^2


证明使用此技术计算的数量在数学上等同于标准偏差。



 类似资料:
  • 本文向大家介绍盘点提高 Python 代码效率的方法,包括了盘点提高 Python 代码效率的方法的使用技巧和注意事项,需要的朋友参考一下 第一招:蛇打七寸:定位瓶颈 首先,第一步是定位瓶颈。举个简单的栗子,一个函数可以从1秒优化到到0.9秒,另一个函数可以从1分钟优化到30秒,如果要花的代价相同,而且时间限制只能搞定一个,搞哪个?根据短板原理,当然选第二个啦。 一个有经验的程序员在这里一定会迟疑

  • 问题内容: 我需要一个滚动窗口(也称为滑动窗口)可在序列/迭代器/生成器上使用。默认的Python迭代可视为一种特殊情况,其中窗口长度为1。我目前正在使用以下代码。有没有人有一个更蟒蛇,更少冗长,或更有效的方法来做这件事? 问题答案: 117 Python文档的旧版本中有一个带有示例: 文档中的一个更为简洁,我想它可以起到更大的作用。

  • 假设我有一个每1分钟开始的2小时窗口。下一步是应用GroupBy转换。 如果能解释这一点,我将不胜感激。无法真正找到相关信息

  • 【代码效率】页面主要反馈和分析项目运行过程中代码的 “CPU占用时间” 和 “堆内存分配” 情况。其中,这里所分析的代码既包含Unity引擎的自身模块代码,也包含您自己书写的逻辑脚本。通过该部分,您将快速掌握项目中逻辑代码的运行性能瓶颈,从而有的放矢地进行改进和优化。 CPU占用时间 函数汇总 该项主要显示项目运行过程中具有较高CPU占用的函数列表,包括函数的 “总CPU耗时”、“最大单次CPU占

  • 我正在制作一个应用程序,其中通过每5秒一次的间隔HTTP请求收集来自虚拟机的与CPU使用、内存使用、磁盘使用等相关的数据。收集的数据如下所示: 我在Drools Fusion上创建了一些规则,试图看到以下内容:例如,当CPU使用率在过去10秒内达到10%以上时,然后在屏幕上打印一些东西,但我的问题是,即使我在规则中输入了命令,即使尚未通过,规则仍然被触发。这是CPU使用率的规则: 是从HTTP响应