【问题标题】:Python format casts numpy.float32 into Python floatPython 格式将 numpy.float32 转换为 Python float
【发布时间】:2017-10-31 10:53:53
【问题描述】:

我正在输出numpy.float32 值并获得以下信息:

> import numpy as np
> a = np.float32(0.1)
> a, str(a), repr(a)
(0.1, '0.1', '0.1')
> '{}'.format(a)
'0.10000000149011612'
> float(a)
0.10000000149011612

我希望'{}'.format(a) 回复'0.1'

所以我的问题是:

  • 为什么 Python 的 str.formatnumpy.float32 值转换为 Python floats?
  • 我可以更改一些设置以使 Python 的 str.format numpy.float32 值转换为 Python floats 吗?

如果这是相关的:我使用的是 Python 3.4.5 和 numpy 1.10.4。

【问题讨论】:

  • 试试print('{:g}'.format(a))
  • "为什么 Python 的 str.format 将 numpy.float32 值转换为 Python 浮点数?" NumPy 中,而不是 Python。具体来说,np.float32.__format__ 继承自 np.generic.__format__,它选择在应用格式化之前转换为常规 Python 浮点数。这完全在 NumPy 的控制之下。代码:github.com/numpy/numpy/blob/…
  • @MarkDickinson:谢谢,虽然我无法遵循代码,但信息量很大。你能从中得到完整的答案吗?也许包括避免演员 NumPy 方面的方法?

标签: python string numpy floating-point formatting


【解决方案1】:

python 内部使用 64 位浮点数。没有办法改变这一点。与任何浮点数一样,您必须知道有多少位是有效的。

float32 最多有 8 个有效数字:

print "{:.8g}".format(a)

如果要使用 numpy 的字符串格式,则必须显式转换为字符串:

print "{!s}".format(a)

【讨论】:

  • 您能否详细说明为什么str.format 不使用str(a)?我怎样才能避免这个演员表? (我知道所涉及的浮点类型问题,如我的问题中所述,因此您的部分答案可能会被删除。)
  • '{:!s}'.format(a) 给出ValueError: Invalid format specifier
  • 没有: 用于!s。这就是强制format 使用str(a) 的方式。
  • @Daniel 你得到了我对{!s} 技巧的支持。请注意,OP 否决了我的答案,这是新的(以前从未见过,除了虚假的答案)所以认为自己很幸运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 2014-09-02
  • 2023-03-10
相关资源
最近更新 更多