如何使scipy.io.mmwrite输出非科学计数法的常规浮点数?
解决Scipy mmwrite输出常规浮点数而非科学计数法的问题
好问题!scipy.io.mmwrite 确实没有直接提供控制浮点数输出格式的参数,但我们可以通过两种简便方式实现你想要的常规浮点数输出,完全不需要事后重新读取修改文件:
方法一:利用Numpy的打印上下文管理器(推荐)
mmwrite 在输出矩阵数值时,底层依赖Numpy的数组打印逻辑,所以我们可以用 np.printoptions 上下文管理器临时修改全局打印设置,让输出强制使用常规浮点数格式:
import numpy as np from scipy.io import mmwrite from scipy.sparse import csr_matrix # 假设你的CSR稀疏矩阵是csr_mat csr_mat = csr_matrix(np.random.rand(1719, 2504).astype(np.float32)) # 临时设置打印选项:抑制科学计数法,保留足够小数位 with np.printoptions(suppress=True, precision=8): mmwrite('output.mtx', csr_mat)
关键参数说明:
suppress=True:强制禁用科学计数法,将数值以常规浮点数形式输出precision=8:控制小数位数,确保足够的精度(避免因位数不足自动切换回科学计数法)
如果遇到极端大小的数值(极小/极大),suppress=True 可能仍会触发科学计数法,这时候可以用自定义格式化器强制固定格式:
with np.printoptions(formatter={'float': '{:.8f}'.format}): mmwrite('output.mtx', csr_mat)
方法二:手动构建Matrix Market文件内容(更灵活)
如果你需要完全自定义输出格式,可以手动拼接MTX文件的头部和数据行,直接控制每一个数值的格式:
from scipy.sparse import csr_matrix csr_mat = csr_matrix(np.random.rand(1719, 2504).astype(np.float32)) # 构建MTX文件头部(注意Matrix Market使用1-based索引) header = ( "%%MatrixMarket matrix coordinate real general\n" "% \n" f"{csr_mat.shape[0]} {csr_mat.shape[1]} {csr_mat.nnz}" ) # 提取行、列(转换为1-based)和数据 rows = csr_mat.row + 1 cols = csr_mat.col + 1 data = csr_mat.data # 格式化每一行数据,使用8位小数的常规格式 data_lines = [f"{r} {c} {d:.8f}" for r, c, d in zip(rows, cols, data)] # 合并所有内容并写入文件 full_content = "\n".join([header] + data_lines) with open('output.mtx', 'w') as f: f.write(full_content)
这种方法虽然代码稍多,但能完全控制输出的每一个细节,适合有特殊格式要求的场景。
补充说明:
你提到的强制转换为double/float类型其实不需要——不管是float32还是float64,只要设置好Numpy的打印选项,都能输出常规浮点数格式。
内容的提问来源于stack exchange,提问作者julienla
相关产品推荐
相关产品推荐

