求助:如何无痛导入无逗号分隔的二维数组文本文件?
问题描述
有一批来自计算集群的数据被输出至.txt文件,格式为
[[a b] [c d]],各项间无逗号分隔。因数组规模较大,手动添加逗号不现实。尝试用np.loadtxt()导入时,收到"could not convert string to float"错误,无法将字符串转为浮点数,需将数据导入为二维数组。
样本数据:
[[-5.188485 -4.172135 -3.595145 -3.37876 -3.22908 -3.17178 -3.035295 -3.012515 -2.60205 -2.772435] [-5.39632 -4.377455 -3.71267 -3.22333 -3.192535 -3.125055 -2.88394 -2.779245 -2.720865 -2.587565] [-5.312065 -4.102625 -3.795785 -3.257695 -3.28473 -2.96552 -2.707215 -2.94055 -2.95986 -2.87657 ]]
可行解决方案
方法1:正则替换后解析为NumPy数组
通过正则表达式将数组内的空格替换为逗号,转换为标准Python列表格式后再解析:
import numpy as np import re # 读取文件内容 with open('sample.txt', 'r') as f: content = f.read() # 替换数字/括号间的空格为逗号 processed_content = re.sub(r'(?<=[\d\]])\s+(?=[\d\[])', ',', content) # 解析为NumPy二维数组 arr = np.array(eval(processed_content)) print(arr)
该正则仅匹配数值或括号之间的空格,避免破坏数组结构,转换后可直接通过eval解析,再转为NumPy数组。
方法2:逐行提取数值
跳过括号,直接提取每行的数值并转换:
import numpy as np data_rows = [] with open('sample.txt', 'r') as f: for line in f: # 清理行首尾的括号和空白字符 cleaned = line.strip().strip('[]') if cleaned: # 按空格分割并转换为浮点数列表 row = list(map(float, cleaned.split())) data_rows.append(row) # 转为二维数组 arr = np.array(data_rows) print(arr)
这种方法逻辑简单,适合格式规整的数据集,无需处理复杂的正则表达式。
方法3:使用np.genfromtxt配合自定义转换器
通过自定义转换器处理每行的括号,直接生成数组:
import numpy as np def clean_line(line): # 解码字节为字符串,清理括号 s = line.decode('utf-8').strip().strip('[]') return np.array(list(map(float, s.split()))) if s else np.array([]) # 读取文件并应用转换器 raw_arr = np.genfromtxt('sample.txt', converters={0: clean_line}) # 过滤空行并重塑为二维数组(需根据实际列数调整10) arr = raw_arr[raw_arr.size != 0].reshape(-1, 10) print(arr)
注意:需将reshape的第二个参数替换为数据集实际的列数,若不确定列数,可先读取一行获取列数后再处理。
内容的提问来源于stack exchange,提问作者Tony Yu
相关产品推荐
相关产品推荐

