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

Python读取.dat文件提取数值:优化方法及均值计算

优化方案:高效读取并处理.dat文件数据

原代码的问题点

  • 循环内重复将列表转为numpy数组,完全没必要,会拖慢效率
  • 变量命名冗余混乱(比如s1、s_1、r1这类重复变量)
  • 均值计算公式有误:原代码avgg=r1_f+r2_f/2是s1数值 + s2数值/2,不符合“两列取平均再算整体均值”的需求,正确逻辑应该是(r1_f + r2_f)/2
  • 冗余导入了os.path和statistics.mean,全程没用到

方法1:用numpy直接处理(高效简洁)

利用numpy的loadtxt直接读取文件,配合自定义转换器一步完成前缀去除和数值转换,避免多次循环和数组重复创建:

import numpy as np

# 定义转换器:去掉字符串前2位,转成浮点数
def strip_prefix(s):
    return float(s.decode()[2:])

# 直接读取文件的第2、3列,用转换器处理前缀
data = np.loadtxt('serial_2.dat', usecols=(1, 2), converters={1: strip_prefix, 2: strip_prefix}, dtype=np.float32)

# 计算每行的均值,再求整体均值
row_means = (data[:, 0] + data[:, 1]) / 2
overall_mean = np.mean(row_means)

print(overall_mean)

方法2:用原生Python简化循环

如果不想依赖numpy,合并两次循环为一次,直接在读取行时完成数值提取,减少中间变量:

with open('serial_2.dat', 'r') as f:
    row_data = []
    for line in f:
        parts = line.strip().split()
        if len(parts) == 3:  # 确保行格式符合要求
            # 直接提取前缀后的数值
            sa_val = float(parts[1][2:])
            sc_val = float(parts[2][2:])
            row_data.append((sa_val, sc_val))

# 计算整体均值
row_means = [(a + b) / 2 for a, b in row_data]
overall_mean = sum(row_means) / len(row_means)

print(overall_mean)

方法3:用pandas处理(适合后续扩展)

如果之后还有更复杂的数据清洗、分析需求,pandas的批量处理会更省心:

import pandas as pd

# 读取文件,用空格作为分隔符,指定列名
df = pd.read_csv('serial_2.dat', sep='\s+', names=['time', 'sa', 'sc'])

# 批量提取前缀后的数值并转成浮点型
df['sa_val'] = df['sa'].str[2:].astype(float)
df['sc_val'] = df['sc'].str[2:].astype(float)

# 计算每行均值和整体均值
df['row_mean'] = (df['sa_val'] + df['sc_val']) / 2
overall_mean = df['row_mean'].mean()

print(overall_mean)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 00:10:17