擅长:python、mysql、java
<p>尽管是一个老线程,但我将添加另一个由<a href="https://rigtorp.se/2011/01/01/rolling-statistics-numpy.html" rel="nofollow noreferrer">this</a>修改的方法,它不依赖panda或python循环。本质上,使用numpy的跨步技巧,您可以首先创建一个带跨步的数组视图,这样计算沿最后一个轴的函数统计值就相当于执行滚动统计值。我修改了原始代码,通过填充添加最后一个轴的开始,输出形状与输入形状相同。</p>
<pre class="lang-py prettyprint-override"><code>import numpy as np
def rolling_window(a, window):
pad = np.ones(len(a.shape), dtype=np.int32)
pad[-1] = window-1
pad = list(zip(pad, np.zeros(len(a.shape), dtype=np.int32)))
a = np.pad(a, pad,mode='reflect')
shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
strides = a.strides + (a.strides[-1],)
return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
a = np.arange(30).reshape((5,6))
# rolling mean along last axis
np.mean(rolling_window(a, 3), axis=-1)
# rolling var along last axis
np.var(rolling_window(a, 3), axis=-1)
# rolling median along last axis
np.median(rolling_window(a, 3), axis=-1)
</code></pre>