如何对二维数组执行滚动均值计算?
如何对二维数组执行滚动均值计算?
嘿,这个问题我太熟了!你要做的是二维数组的滑动窗口均值计算,还不想用循环,那用numpy的工具就能完美解决,效率超高。
先明确下你的需求:输入是形状为(6000, 3)的数组,要取连续3行的所有元素(也就是一个3×3的窗口),计算每个窗口的均值,最终得到长度为5998的一维数组——毕竟6000 - 3 + 1 = 5998,刚好是窗口能滑动的次数。
直接上代码,一步一步来:
- 先导入numpy,构造示例数组(你替换成自己的数组就行):
import numpy as np # 构造一个和你需求形状一致的示例数组 arr = np.random.rand(6000, 3)
- 用滑动窗口工具生成所有
3×3的窗口:
# 创建滑动窗口,窗口尺寸设置为(3,3),对应3行3列 windows = np.lib.stride_tricks.sliding_window_view(arr, window_shape=(3, 3))
这里生成的windows形状是(5998, 1, 3, 3),多出来的那个长度为1的维度是因为原数组列数刚好是3,列方向没法滑动,所以我们接下来处理掉它。
- 计算每个窗口的均值:
你可以用两种方式实现,选哪种都可以:
- 方式一:先把窗口展平成二维数组,再按行求均值
flattened_windows = windows.reshape(-1, 9) # 每个窗口9个元素 mean_array = flattened_windows.mean(axis=1)
- 方式二:直接对窗口的行、列维度求均值,再去掉多余维度
mean_array = windows.mean(axis=(2, 3)).squeeze()
最终得到的mean_array就是形状为(5998,)的数组,完全符合你的要求!
为啥不用循环?因为numpy的这些函数都是底层用C实现的,比Python写for循环快太多了,尤其是处理几千行的数组,效率差距特别明显,我之前处理时序数据时经常这么用,省心又高效。
备注:内容来源于stack exchange,提问作者Polly Gill
相关产品推荐
相关产品推荐

