TXT格式矩阵转换为numpy矩阵时出现字符串转float报错如何解决
问题解决方法
错误根因
- 核心问题是你写的正则表达式捕获组规则存在缺陷:
[0-9e+.]+没有包含科学计数法里的负号-,当匹配到带负指数的数值(例如8.259e-004)时,正则会在匹配到e之后停止,最终拿到的字符串是不完整的8.259e,无法转为float类型。 - 另外你粘贴的代码存在缩进错误:
with open代码块下的data = file.read()没有缩进,运行时会抛出语法错误,且代码未导入re模块也会导致运行报错。
修复方案
1. 修正正则表达式
把原来的数值捕获规则替换为可完整匹配科学计数法(含正负号、大小写E)的规则:([\d.eE+-]+)
如果需要更严谨的匹配避免误抓,也可以用针对性更强的规则:(-?\d+\.?\d*[eE][+-]?\d+)
2. 完整可运行代码
import re import numpy as np n = 6567 # 直接初始化numpy矩阵,比Python原生列表更省内存、后续操作更方便 kmat = np.zeros((n, n), dtype=np.float64) with open("stiff_matrix.txt", "r", encoding="utf-8") as file: data = file.read() # 修正后的正则匹配规则 for x, y, value in re.findall(r'\[\s*(\d+),\s*(\d+)\s*\]: ([\d.eE+-]+)', data): x_idx = int(x) - 1 y_idx = int(y) - 1 kmat[x_idx][y_idx] = float(value)
3. 大文件优化方案
如果你的矩阵文件体积过大,一次性读取全部内容会占用过高内存,可以改为逐行读取解析:
import re import numpy as np n = 6567 kmat = np.zeros((n, n), dtype=np.float64) # 预编译正则,提升大文件解析效率 pattern = re.compile(r'\[\s*(\d+),\s*(\d+)\s*\]: ([\d.eE+-]+)') with open("stiff_matrix.txt", "r", encoding="utf-8") as file: for line in file: for x, y, value in pattern.findall(line): x_idx = int(x) - 1 y_idx = int(y) - 1 kmat[x_idx][y_idx] = float(value)
4. 可选异常捕获
如果担心文件中存在异常格式的数值,可以增加异常捕获避免程序中断,同时定位问题位置:
import re import numpy as np n = 6567 kmat = np.zeros((n, n), dtype=np.float64) pattern = re.compile(r'\[\s*(\d+),\s*(\d+)\s*\]: ([\d.eE+-]+)') with open("stiff_matrix.txt", "r", encoding="utf-8") as file: for line_num, line in enumerate(file, 1): for x, y, value in pattern.findall(line): try: x_idx = int(x) - 1 y_idx = int(y) - 1 kmat[x_idx][y_idx] = float(value) except ValueError as e: print(f"第{line_num}行存在异常数值:{value},错误信息:{e}")
内容的提问来源于stack exchange,提问作者Md Salem
相关产品推荐
相关产品推荐

