Python二维数组按行每10个数据求移动平均如何保留151列
问题背景
现有形状为(1000, 151)的numpy数组aN,需求为沿行方向每10行计算一次平均值,输出结果需保留原数组的151列。
原有实现代码运行后仅得到长度为100的一维列表,不符合预期,原代码如下:
arr = aN[:] window_size = 10 i = 0 moving_averages = [] while i < len(arr) - window_size + 1: window_average = round(np.sum(arr[i:i+window_size]) / window_size, 2) moving_averages.append(window_average) i += 10
错误原因
原代码的核心问题是调用np.sum()时未指定计算轴:
- 未指定
axis参数时,np.sum()会对截取到的10*151二维窗口内所有元素做全局求和,最终输出单个标量值 - 逐窗口累计标量值后,最终自然得到长度为100的一维列表,丢失了原数组的列维度
实现方案
方案1:numpy向量化实现(推荐,性能最优)
当总行数可被窗口大小整除时(当前场景1000行/窗口10行刚好满足),直接通过reshape拆分维度后沿指定轴求平均,无需写循环:
import numpy as np window_size = 10 # 将行维度拆分为 [窗口数量, 单窗口行数, 原列数],沿窗口内的行轴求列平均 result = aN.reshape(-1, window_size, aN.shape[1]).mean(axis=1).round(2)
运行后result的形状为(100, 151),完全保留原数组151列的结构。
方案2:修正原有循环逻辑
如果要保留循环写法,只需要在求和时指定axis=0,即沿行轴对每一列单独求和计算平均值即可:
arr = aN[:] window_size = 10 i = 0 moving_averages = [] while i < len(arr) - window_size + 1: # 指定axis=0,沿行方向计算每列的窗口平均值 window_average = np.round(np.sum(arr[i:i+window_size], axis=0) / window_size, 2) moving_averages.append(window_average) i += window_size # 将列表转为numpy数组,最终形状为(100, 151) moving_averages = np.array(moving_averages)
内容的提问来源于stack exchange,提问作者Pahan
相关产品推荐
相关产品推荐

