如何控制 NumPy float64 标量的显示精度?

如何解决如何控制 NumPy float64 标量的显示精度?

我正在编写一个教学文档,该文档使用了大量 Python 代码示例并包含结果数字输出。我在 IPython 内部工作,很多示例都使用 NumPy。

想避免打印语句、显式格式或类型转换。他们把例子弄得乱七八糟,有损于我试图解释的原则。

我所知道的:

  • 在 IPython 中,我可以使用 %precision 来控制任何 float 结果的显示精度。

  • 我可以使用 np.set_printoptions() 来控制 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?