因为np.savetxt默认格式为'%.18e',即18位精度科学计数法,以确保数值精度,但牺牲可读性。

为什么 np.savetxt 默认用科学计数法导出小数?
因为 NumPy 的 np.savetxt 在遇到浮点数时,会调用底层的格式化逻辑,默认启用科学计数法(尤其是当数值绝对值 1.234567e-05 这类输出,往往是因为数组里混入了极小/极大值,或 dtype 是 float64 且未显式指定格式。
用 fmt 参数绕过默认科学计数法
np.savetxt 的 fmt 参数直接控制每个字段的字符串格式,它是解决该问题最直接的方式。关键不是禁用科学计数法,而是「明确告诉它用什么格式」:
- 写成
fmt='%.6f':强制固定小数位,0.000012不会变1.2e-05 - 写成
fmt='%.6g':自动在固定和科学之间选更短的,0.000123→0.000123,0.000000123→1.23e-07(仍可能触发) - 若需统一保留 6 位有效数字且禁用 e 记法,只能用
fmt='%.6f',但要注意:太小的数会变成0.000000
示例:
np.savetxt('data.txt', data, fmt='%.8f', delimiter=',')
np.format_float_scientific 不是导出函数,别误用
这个函数名字有误导性——它只做单个浮点数到字符串的转换,**不参与 np.savetxt 流程**。你不能把它传给 fmt,也不能靠它批量改数组显示。常见错误写法:
# ❌ 错误:format_float_scientific 返回字符串,不是格式化模板
np.savetxt('out.txt', data, fmt=np.format_float_scientific)
它真正的用途是调试时手动看某个数怎么格式化:
np.format_float_scientific(0.00000123, exp_digits=2, unique=False)返回
'1.23e-06',仅此而已。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
立即学习“Python免费学习笔记(深入)”;
导出前预处理数组:避免 fmt 失效的边界情况
当数组含 inf、-inf 或 nan 时,fmt='%.6f' 会输出 inf、-inf、nan 字符串,某些下游工具(如 Excel)无法识别。这时得提前清理:
- 用
np.nan_to_num(data, nan=0.0, posinf=1e10, neginf=-1e10)替换异常值 - 若必须保留
nan语义,改用fmt='%s'+ 手动np.array2string控制,但会失去二进制精度 - 注意:
np.savetxt对整数列也会套用fmt,所以混合类型数组建议先转成objectdtype 再逐列格式化
真正难的不是选哪个格式化函数,而是意识到 np.savetxt 的 fmt 是唯一可控入口;所有“禁用科学计数法”的诉求,最终都得落到这个字符串模板上,且要同时兼顾数值范围、精度需求和下游兼容性。

















