如何读取带特殊科学计数法格式的矩阵文件并转为numpy数组
问题原因
警告触发的根本原因是数据行中负数和前一个数值之间无空格分隔,比如示例中的1.5509636485369E-25-2.0531419826552E-27会被默认的空格分割识别为单个字符串,numpy无法将其解析为合法浮点数,因此抛出未读完数据的警告。
解决方案
方案1:numpy原生实现(无额外依赖,内存效率高)
直接跳过指定表头行,通过正则补充分隔符后读取,不需要生成中间文件,适合大文件处理:
import numpy as np import re header_lines = 3 # 替换为你实际需要跳过的表头行数 pattern = re.compile(r'(?<!^)(?=-)') # 匹配非行首位置的负号前的插入点 data_str = '' with open('test.txt', 'r') as f: # 跳过表头行,不需要加载全量内容到内存 for _ in range(header_lines): next(f) # 逐行处理数据 for line in f: processed_line = pattern.sub(' ', line.strip()) data_str += processed_line + ' ' # 转换为numpy数组并调整为N×4的结构 matrix = np.fromstring(data_str, sep=' ').reshape(-1, 4)
方案2:pandas简洁实现(代码量低,自动处理格式)
利用pandas的正则分隔符功能,一行逻辑完成读取:
import pandas as pd import numpy as np header_lines = 3 # 替换为你实际需要跳过的表头行数 df = pd.read_csv( 'test.txt', skiprows=header_lines, sep=r'\s+|(?=-)', # 分隔符匹配空格或负号前的位置 engine='python', header=None ) # 转换为numpy数组 matrix = df.to_numpy(dtype=np.float64)
说明
- 两种方案都不需要创建或复制新文件,直接对原文件读取处理,适配300MB级别的文件大小
- numpy方案内存占用更低,适合对性能要求高的场景;pandas方案代码更简洁,适合快速开发场景
内容的提问来源于stack exchange,提问作者user175924
相关产品推荐
相关产品推荐

