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

如何使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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 20:42:48