如何为numpy数组和浮点标量统一设置默认浮点输出格式化规则
可行实现方案
有两种常用的可靠实现方式,都可以满足无需每次单独指定格式化参数的需求:
方案1:全局替换内置print函数(兼容性最好,无侵入性风险)
这个方案不需要修改Python内置类属性,仅通过封装原生print函数实现,适用于所有运行环境:
import builtins import numpy as np # 定义统一的浮点数格式化规则,适配你需要的2.234e3格式 def float_formatter(x): if not isinstance(x, float) or isinstance(x, bool): return x # 先按3位有效数字科学计数法格式化,再去掉正号简化输出 base_str = format(x, ".3e") return base_str.replace("e+", "e").replace("e0", "e") # 封装原生print函数 original_print = builtins.print def custom_print(*args, **kwargs): processed_args = [float_formatter(arg) for arg in args] original_print(*processed_args, **kwargs) builtins.print = custom_print # 测试效果 print('g equals ',2234.23) # 输出:g equals 2.234e3 # 不影响numpy数组的原有格式化 np.set_printoptions(formatter={'float_kind':float_formatter}) print(np.array([1.2345, 6789.1])) # 输出:[1.234e0 6.789e3]
方案2:通过自定义float子类实现(适用于自有浮点变量场景)
如果你的浮点变量都是自己代码生成的,可以统一使用继承自float的自定义子类,修改其字符串输出逻辑:
def format_float(x): base_str = format(x, ".3e") return base_str.replace("e+", "e").replace("e0", "e") class FormattedFloat(float): def __str__(self): return format_float(self) def __repr__(self): return format_float(self) # 测试效果 g = FormattedFloat(2234.23) print('g equals ', g) # 输出:g equals 2.234e3
注意:第二种方案仅对使用
FormattedFloat定义的变量生效,无法覆盖第三方代码返回的原生float类型输出。
内容的提问来源于stack exchange,提问作者wilk
相关产品推荐
相关产品推荐

