如何正确计算numpy数组每16元素分组的众数实现多数投票
问题说明
现有需求为对CSV文件存储的大型NumPy数组做分块众数计算:
- 每16个连续元素为一个分组
- 末尾不足16个元素的剩余分组同样执行多数投票求众数
- 所有分组的众数结果需存入新文件
原有代码无法实现预期效果的核心问题:
- 未将CSV读取到的字符串内容转换为数值格式,直接传入NumPy/SciPy计算函数会触发类型错误
- 未实现16元素步长的分块逻辑
- 循环逻辑错误:逐行遍历CSV时直接将整个csv.reader对象传入
np.unique,无法得到正确的元素统计结果 - 缺少计算结果写入新文件的逻辑
可直接运行的实现代码
import csv import numpy as np from scipy.stats import mode # 固定配置 BLOCK_SIZE = 16 INPUT_PATH = "prediction-pairs-overall.csv" OUTPUT_PATH = "block_mode_results.csv" # 读取CSV数据转为一维数值数组 all_values = [] with open(INPUT_PATH, "r", newline="") as infile: reader = csv.reader(infile, delimiter=",") for row in reader: # 若你的数据为浮点型,将下方int替换为float即可 all_values.extend([int(cell) for cell in row]) all_values = np.array(all_values) block_modes = [] # 逐块切片计算众数 for pos in range(0, len(all_values), BLOCK_SIZE): current_block = all_values[pos : pos + BLOCK_SIZE] # 取当前块众数值 mode_res = mode(current_block, keepdims=False).mode block_modes.append(mode_res) # 结果写入新CSV with open(OUTPUT_PATH, "w", newline="") as outfile: writer = csv.writer(outfile) for val in block_modes: writer.writerow([val])
关键逻辑说明
- 采用固定步长切片的方式做分块,不需要额外判断末尾剩余元素长度,不足16个元素的尾部块会被自动切出单独计算
- 读取CSV时统一做类型转换,避免字符串类型导致的统计错误
- 调用
mode时传入keepdims=False,适配SciPy 1.9及以上版本的接口规则,避免返回维度异常 - 结果默认每行存一个众数值,可根据自身需求调整写入格式
内容的提问来源于stack exchange,提问作者Nischay
相关产品推荐
相关产品推荐

