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

如何读取带特殊科学计数法格式的矩阵文件并转为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 13:45:10