You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Numpy的节点值高效聚合优化:同时间同节点均值计算提速

优化Numpy实现按时间+节点标签分组求均值的性能

需求说明

数据集格式为时间 | 节点标签 | 数值列,存在同一时间下同一节点对应多行数值的情况,需要:

  • 对同一时间+节点标签的数值列取均值
  • 保留每组的均值行,删除其余行
  • 最终结果按时间升序、节点标签升序排列

示例

原始数据:

Time | Node Label | Values

 1           3       10    5
 1           5       15    11
 1           3       -6    7
 2           3        8    4
 2           5        3    9
 2           3        1    1

处理后数据:

Time | Node Label | Values

 1           3       2    6
 1           5       15   11
 2           3       4.5  2.5
 2           5        3    9

现有实现的问题

当前代码通过显式循环遍历所有可能的时间-节点组合(包括无数据的空组),在大型数据集下性能急剧下降,耗时长达数小时。核心问题在于:

  • 遍历了大量不必要的空分组
  • 显式循环的效率远低于Numpy的向量化操作

优化方案(纯Numpy)

利用Numpy的向量化操作替代显式循环,通过分组求和+计数的方式计算均值,避免遍历空分组,大幅提升效率:

代码实现

import numpy as np

def group_mean_by_time_label(data):
    # 拆分时间列、标签列和数值列
    time_col = data[:, 0]
    label_col = data[:, 1]
    value_cols = data[:, 2:]
    
    # 组合时间与标签作为分组键,提取有效分组、分组索引及每组样本数
    group_keys = np.stack((time_col, label_col), axis=1)
    unique_groups, group_indices, group_counts = np.unique(
        group_keys, axis=0, return_inverse=True, return_counts=True
    )
    
    # 对每个数值列按分组求和,再除以样本数得到均值
    value_means = np.column_stack([
        np.bincount(group_indices, weights=value_cols[:, i]) / group_counts
        for i in range(value_cols.shape[1])
    ])
    
    # 拼接唯一分组与均值列得到结果
    result = np.hstack((unique_groups, value_means))
    
    # 按时间、标签升序排序(np.unique已默认返回有序分组,若原始数据无序可保留此步)
    result = result[np.lexsort((result[:, 1], result[:, 0]))]
    
    return result

优化原理

  1. 过滤无效分组:通过np.unique直接获取所有存在数据的时间-节点分组,自动跳过空分组,避免无效遍历
  2. 向量化计算:使用np.bincount配合权重参数实现高效分组求和,替代Python层面的显式循环
  3. 精简操作流程:直接拼接唯一分组与均值结果,减少冗余的数组拼接操作

性能提升

该方案完全基于Numpy底层向量化操作,避免了Python循环的性能损耗,在大型数据集下处理速度可提升数十倍至上百倍,彻底解决耗时过长的问题。

内容的提问来源于stack exchange,提问作者Alessio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 01:22:04