如何解决如何控制 NumPy float64 标量的显示精度?
我正在编写一个教学文档,该文档使用了大量 Python 代码示例并包含结果数字输出。我在 IPython 内部工作,很多示例都使用 NumPy。
我想避免打印语句、显式格式或类型转换。他们把例子弄得乱七八糟,有损于我试图解释的原则。
我所知道的:
我正在寻找的是一种控制 NumPy float64
标量的显示精度的方法,该标量不响应上述任何一项。这些由许多 NumPy 函数返回。
>>> x = some_function()
Out[2]: 0.123456789
>>> type(x)
Out[3]: numpy.float64
>>> %precision 2
Out[4]: '%.2f'
>>> x
Out[5]: 0.123456789
>>> float(x) # that precision works for regular floats
Out[6]: 0.12
>>> np.set_printoptions(precision=2)
>>> x # but doesn't work for the float64
Out[8]: 0.123456789
>>> np.r_[x] # does work if it's in an array
Out[9]: array([0.12])
我想要的是
>>> # some formatting command
>>> x = some_function() # that returns a float64 = 0.123456789
Out[2]: 0.12
但我会满足于:
- 一种告诉 NumPy 默认给我
float
标量而不是float64
的方法。 - 一种告诉 IPython 如何处理
float64
的方法,有点像我可以用repr_pretty
为自己的类做的事情。
解决方法
IPython 具有格式化程序 (core/formatters.py
),其中包含将类型映射到格式方法的字典。格式化程序中似乎有一些关于 NumPy 的知识,但不是 np.float64
类型。
有一个 bunch of formatters,用于 HTML、LaTeX 等,但 text/plain
用于控制台。
我们首先得到用于控制台文本输出的 IPython 格式化程序
plain = get_ipython().display_formatter.formatters['text/plain']
然后为 float64
类型设置格式化程序,我们使用与 float
已经存在的格式化程序相同的格式化程序,因为它已经知道 %precision
plain.for_type(np.float64,plain.lookup_by_type(float))
现在
In [26]: a = float(1.23456789)
In [28]: b = np.float64(1.23456789)
In [29]: %precision 3
Out[29]: '%.3f'
In [30]: a
Out[30]: 1.235
In [31]: b
Out[31]: 1.235
在实现中,我还发现 %precision
使用合适的格式字符串调用 np.set_printoptions()
。我不知道它这样做了,如果用户已经设置了它,可能会出现问题。按照上面的例子
In [32]: c = np.r_[a,a,a]
In [33]: c
Out[33]: array([1.235,1.235,1.235])
我们看到它对数组元素做了正确的事情。
我可以在自己的代码中明确地进行格式化程序初始化,但更好的修复方法可能是修改 IPython code/formatters.py
行 677
@default('type_printers')
def _type_printers_default(self):
d = pretty._type_pprinters.copy()
d[float] = lambda obj,p,cycle: p.text(self.float_format%obj)
# suggested "fix"
if 'numpy' in sys.modules:
d[numpy.float64] = lambda obj,cycle: p.text(self.float_format%obj)
# end suggested fix
return d
如果包含 np.float64
,也在这里处理 NumPy
。很高兴对此提供反馈,如果我觉得勇敢,我可能会提交 PR。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。