如何修改numpy数组单列计算逻辑,实现多列批量处理生成多列结果数组
实现方案
方案1:NumPy向量化实现(推荐,无需嵌套循环)
该方案利用numpy数组维度变换批量处理所有列,性能远高于循环实现,同时支持自定义窗口大小:
import numpy as np def calc_window_indicators(total_demand, window_size=48): # 若原始total_demand维度为(列数, 时间步),请打开下方转置注释,调整为(时间步, 列数) # total_demand = total_demand.T time_steps, n_cols = total_demand.shape # 计算有效窗口数,整除保证每个窗口都有window_size个元素 n_windows = time_steps // window_size # 维度拆分:(总时间步, 列数) → (窗口数, 窗口大小, 列数) windowed_data = total_demand[:n_windows*window_size].reshape(n_windows, window_size, n_cols) # 批量计算所有窗口、所有列的指标 sum_win = windowed_data.sum(axis=1) # 对应gig_d,维度(窗口数, 列数) max_win = windowed_data.max(axis=1) min_win = windowed_data.min(axis=1) diff_win = max_win - min_win # 对应subtract_d mean_win = sum_win // 12 reldif_win = mean_win // diff_win # 对应real_d return sum_win, diff_win, reldif_win # 调用示例 gig_d, subtract_d, real_d = calc_window_indicators(total_demand, window_size=48)
- 输出的三个数组维度均为
(窗口数, 列数),每一列对应输入数组同列的计算结果,完全匹配需求 - 可直接修改
window_size参数调整步长,无需硬编码48
方案2:原有循环逻辑改造
如果需要沿用你原有的嵌套循环思路,只需在外层增加列遍历即可:
def calc_window_indicators_loop(total_demand, window_size=48): n_cols = total_demand.shape[0] # 适配你当前(列数, 时间步)的total_demand结构 n_windows = len(date_calc) # 初始化结果数组,维度为(窗口数, 列数) gig_d = np.zeros((n_windows, n_cols), dtype=float) subtract_d = np.zeros((n_windows, n_cols), dtype=float) real_d = np.zeros((n_windows, n_cols), dtype=float) for col_idx in range(n_cols): col_data = total_demand[col_idx] # 提取当前列数据 s = 0 e = window_size for win_idx in range(n_windows): n = col_data[s:e] x = sum(n) mi = min(n) ma = max(n) diff = ma - mi mean = x//12 reldif = mean//diff s += window_size e += window_size # 写入对应位置 gig_d[win_idx, col_idx] = x subtract_d[win_idx, col_idx] = diff real_d[win_idx, col_idx] = reldif return gig_d, subtract_d, real_d
- 注意补充边界判断:如果某个窗口内所有数值相同,diff会为0,计算reldif会触发除零报错,可根据业务逻辑增加异常处理。
内容的提问来源于stack exchange,提问作者Renaissance Man
相关产品推荐
相关产品推荐

