Python 3中如何基于索引对二维数据按数量分箱并求均值?
按指定箱大小分箱并计算二维数据均值的实现方案
嘿,我来帮你搞定这个分箱计算均值的需求。首先得明确下:你给的这串一维数据其实是交替排列的两列数据(比如第0、2、4...位是第一列,第1、3、5...位是第二列),要按每箱n个值来分组,然后算出每个箱子里两列各自的均值对吧?
先理清楚步骤
- 把一维数据转成两列的结构,方便后续处理;
- 确定每箱包含多少组数据——因为每组是2个值,所以每箱
n个值对应的就是n//2组; - 把数据按这个大小分箱,然后对每个箱子的两列分别计算均值;
- 输出最终结果。
两种实现方式
我给你准备了两种方案,一种用numpy(处理大数据更高效顺手),一种纯Python(不用装额外第三方库),你按需选择:
方案一:使用numpy(推荐)
import numpy as np # 你的原始数据 raw_data = [1, 0.5, 3, 0.6, 5, 0.7, 6, 0.8, 8, 0.9, 10, 1, 11, 1.1, 12, 1.2, 14, 1.3, 15, 1.4, 17, 1.5, 18, 1.6, 19, 1.7, 20, 1.8, 22, 1.9, 24, 2, 25, 2.1, 28, 2.2, 31, 2.3, 35, 2.4] box_value_count = 4 # 你例子里的每箱4个值,这里可以按需修改 # 转成2列的数组结构 two_column_data = np.array(raw_data).reshape(-1, 2) # 计算每箱包含的行数(每组数据对应一行) rows_per_box = box_value_count // 2 # 分箱并计算每个箱子的均值 # 如果数据不能被刚好分完,numpy的array_split会自动处理最后一个箱子 box_means = [box.mean(axis=0) for box in np.array_split(two_column_data, len(two_column_data)//rows_per_box)] # 打印结果 print("各箱子的均值(第一列,第二列):") for box_num, mean in enumerate(box_means, 1): print(f"第{box_num}箱:{mean[0]:.2f}, {mean[1]:.2f}")
方案二:纯Python实现
raw_data = [1, 0.5, 3, 0.6, 5, 0.7, 6, 0.8, 8, 0.9, 10, 1, 11, 1.1, 12, 1.2, 14, 1.3, 15, 1.4, 17, 1.5, 18, 1.6, 19, 1.7, 20, 1.8, 22, 1.9, 24, 2, 25, 2.1, 28, 2.2, 31, 2.3, 35, 2.4] box_value_count = 4 # 手动将一维数据转换为两列的列表 two_column = [] for i in range(0, len(raw_data), 2): two_column.append([raw_data[i], raw_data[i+1]]) rows_per_box = box_value_count // 2 box_means = [] # 遍历分箱并计算均值 for i in range(0, len(two_column), rows_per_box): current_box = two_column[i:i+rows_per_box] # 计算第一列的均值 col1_avg = sum(row[0] for row in current_box) / len(current_box) # 计算第二列的均值 col2_avg = sum(row[1] for row in current_box) / len(current_box) box_means.append((col1_avg, col2_avg)) # 输出结果 print("各箱子均值:") for idx, (avg1, avg2) in enumerate(box_means, 1): print(f"箱{idx}: 第一列均值 {avg1:.2f}, 第二列均值 {avg2:.2f}")
示例输出(当box_value_count=4时)
比如你提到的前4个值对应的两组数据[1,0.5]和[3,0.6],第一箱的均值就是(2.0, 0.55),运行代码后会自动算出所有箱子的结果。
小提醒
如果你的原始数据总长度不能被box_value_count整除,最后一个箱子的数值会少一些——上面的两种方案都会自动处理这种情况,你可以根据需求选择是否保留这个不完整的箱子。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

