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

如何对二维NumPy数组的多行分组求和生成新数组?

优化每N行分组求和的NumPy/Pandas实现方案

你当前的嵌套循环写法效率较低,尤其是数据量较大时。下面提供两种更高效的实现方式,完全避免手动循环,适配你的数据结构需求:

方法一:NumPy原生重塑+轴求和

利用NumPy的数组重塑和批量求和能力,直接完成分组计算:

import numpy as np
import pandas as pd

def read_results(N, t_eval):
    # 读取CSV并转为NumPy数组
    solution_cells = pd.read_csv("battery_solution_6.csv").to_numpy()
    # 移除不需要的i列(原数据中i是第二列,索引为1)
    filtered_data = solution_cells[:, [0, 2, 3, 4]]
    # 将数组重塑为(分组数, N, 列数)的三维结构(需保证总行数是N的整数倍)
    grouped_data = filtered_data.reshape(-1, N, filtered_data.shape[1])
    # 对每组内的行求和,得到(分组数, 列数)的结果数组
    summed_results = grouped_data.sum(axis=1)
    # 按需筛选t_eval指定的时间点
    if t_eval:
        t_column = summed_results[:, 0]
        match_mask = np.isin(t_column, t_eval)
        summed_results = summed_results[match_mask]
    return summed_results

方法二:Pandas分组求和(更直观)

既然已经用Pandas读取文件,直接按t列分组求和,代码可读性更高:

import pandas as pd

def read_results(N, t_eval):
    # 读取CSV为DataFrame,保留列名便于操作
    df = pd.read_csv("battery_solution_6.csv")
    # 按t列分组,对x、y、z列求和,最后重置索引保留t列
    summed_df = df.groupby('t')[['x', 'y', 'z']].sum().reset_index()
    # 按需筛选指定时间点
    if t_eval:
        summed_df = summed_df[summed_df['t'].isin(t_eval)]
    # 转为NumPy数组(如果需要)
    return summed_df.to_numpy()

核心优势说明

  • 两种方法都基于底层C实现的批量运算,比Python嵌套循环快几个数量级,数据量越大优势越明显
  • 自动适配整型/浮点型混合的列,求和后会自动统一为合适的数值类型
  • Pandas方法更易维护,适合需要后续数据筛选、列操作的场景;NumPy方法更适合纯数值数组的高性能计算

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:42:38