Python中如何将文件多列按指定分组合并为numpy数组?
问题描述
有如下格式的.txt文件(编码为latin-1):
header line 1 header line 2 x1 y1 x4 y4 x7 y7 x2 y2 x5 y5 x8 y8 x3 y3 x6 y6 x9 y9 footer line
其中x、y值以制表符分隔,数值格式为"2,9 "(包含末尾空格),示例数据如下:
header line 1 header line 2 1,0 1,5 4,0 4,5 7,0 7,5 2,0 2,5 5,0 5,5 8,0 8,5 3,0 3,5 6,0 6,5 9,0 9,5 footer line
需求是将所有x值、y值分别转换为float类型并生成numpy数组,例如x值数组应为:
array([1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0])
现有实现方式是手动读取每一列再合并,但列数较多时操作繁琐:
import numpy as np def ctf(valstr): return float(valstr.replace(',','.').replace(" ","")) def dic(length): dic={} for i in range(0,length): dic[i]=ctf return dic xval1,yval1,xval2,yval2,xval3,yval4=np.genfromtxt( "file.txt", delimiter="", unpack=True, skip_header=2, skip_footer=1, encoding="latin-1", converters=dic(6) ) xvalues=np.concatenate((xval1,xval2,xval3)) yvalues=np.concatenate((yval1,yval2,yval3))
希望找到更简洁的方法,只需指定总列数(如示例中的6)和目标数组数量(如示例中的2)即可完成处理,同时保留数值转换的功能。
优化解决方案
可以通过读取完整数据矩阵,再按步长索引提取对应列并扁平化的方式实现,无需手动枚举每一列:
import numpy as np def ctf(valstr): # 用strip()去除首尾空格,比replace(" ","")更简洁稳妥 return float(valstr.replace(',', '.').strip()) # 配置参数:总列数、目标数组数量 total_cols = 6 target_arrays = 2 # 读取数据,直接生成转换器字典,无需单独定义dic函数 data = np.genfromtxt( "file.txt", delimiter="\t", # 明确指定制表符分隔,避免自动分割歧义 skip_header=2, skip_footer=1, encoding="latin-1", converters={i: ctf for i in range(total_cols)} ) # 按步长提取列:x列是索引0、2、4...,y列是索引1、3、5... xvalues = data[:, ::target_arrays].flatten() yvalues = data[:, 1::target_arrays].flatten()
关键优化点:
- 动态生成转换器字典:用字典推导式
{i: ctf for i in range(total_cols)}替代原dic函数,代码更简洁。 - 矩阵索引提取列:利用numpy的切片语法
[:, ::target_arrays],自动提取所有x列(步长为目标数组数量,从0开始),同理[:,1::target_arrays]提取所有y列。 - 扁平化数组:用
flatten()将二维列矩阵转换为一维数组,替代concatenate手动合并的操作。
这种方法无需关心具体有多少组x/y列,只要调整total_cols和target_arrays两个参数即可适配不同的文件结构,扩展性更强。
内容的提问来源于stack exchange,提问作者jng224
相关产品推荐
相关产品推荐

