擅长:python、mysql、java
<p>酷把戏:你可以计算标准差,只要在窗口中给出平方值和值的和。</p>
<p>因此,您可以使用数据的统一过滤器快速计算标准偏差:</p>
<pre><code>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]
</code></pre>
<p>这比原始函数快得多。对于1024x1024数组和半径为20的数组,旧函数需要34.11秒,而新函数需要<strong>0.11秒,速度提高了300倍。</p>
<hr/>
<p>这在数学上是如何工作的?它计算每个窗口的数量<code>sqrt(mean(x^2) - mean(x)^2)</code>。我们可以从标准差<code>sqrt(mean((x - mean(x))^2))</code>中导出这个量,如下所示:</p>
<p>设<code>E</code>为期望算子(基本上是<code>mean()</code>),设<code>X</code>为数据的随机变量。然后:</p>
<p><code>E[(X - E[X])^2]</code><br/>
<code>= E[X^2 - 2X*E[X] + E[X]^2]</code><br/>
<code>= E[X^2] - E[2X*E[X]] + E[E[X]^2]</code>(通过期望算符的线性)<br/>
<code>= E[X^2] - 2E[X]*E[X] + E[X]^2</code>(同样是线性关系,而且<code>E[X]</code>是一个常数)<br/>
<code>= E[X^2] - E[X]^2</code></p>
<p>这证明了用这种方法计算的量在数学上等价于标准差。</p>