【问题标题】:Formatting floats in a numpy array [duplicate]格式化numpy数组中的浮点数[重复]
【发布时间】:2014-01-27 07:59:44
【问题描述】:

如果我有一个这样的 numpy 数组:

[2.15295647e+01, 8.12531501e+00, 3.97113829e+00, 1.00777250e+01]

我怎样才能移动小数点并格式化数字,所以我最终得到一个像这样的 numpy 数组:

[21.53, 8.13, 3.97, 10.08]

np.around(a, decimals=2) 只给我[2.15300000e+01, 8.13000000e+00, 3.97000000e+00, 1.00800000e+01] 这是我不想要的,我还没有找到另一种方法来做到这一点。

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    为了使 numpy 显示 任意格式的浮点数组,您可以定义一个自定义函数,该函数将浮点值作为其输入并返回格式化字符串:

    In [1]: float_formatter = "{:.2f}".format
    

    这里的f 表示定点格式(不是“科学”),.2 表示两位小数(您可以阅读有关字符串格式的更多信息here)。

    让我们用一个浮点值来测试一下:

    In [2]: float_formatter(1.234567E3)
    Out[2]: '1234.57'
    

    要让 numpy 以这种方式打印所有浮点数组,您可以将 formatter= 参数传递给 np.set_printoptions

    In [3]: np.set_printoptions(formatter={'float_kind':float_formatter})
    

    现在 numpy 将以这种方式打印所有浮点数组:

    In [4]: np.random.randn(5) * 10
    Out[4]: array([5.25, 3.91, 0.04, -1.53, 6.68]
    

    请注意,这只影响 numpy 数组,而不影响标量:

    In [5]: np.pi
    Out[5]: 3.141592653589793
    

    它也不会影响非浮点数、复杂浮点数等 - 您需要为其他标量类型定义单独的格式化程序。

    您还应该知道,这会影响 numpy 显示浮点值的方式 - 将在计算中使用的实际值将保留其原始精度。

    例如:

    In [6]: a = np.array([1E-9])
    
    In [7]: a
    Out[7]: array([0.00])
    
    In [8]: a == 0
    Out[8]: array([False], dtype=bool)
    

    numpy 打印 a 好像它等于 0,但它不是 - 它仍然等于 1E-9

    如果您确实希望以影响它们在计算中的使用方式的方式对数组中的值进行舍入,您应该使用np.round,正如其他人已经指出的那样。

    【讨论】:

    • 如何让它也适用于标量?
    • @nn0p 如果您使用的是 IPython,您可以使用 %precision magic,例如%precision %.2f 不过,这只适用于原生 Python 浮点数(我不知道如何设置 numpy 浮点标量的显示精度)。
    【解决方案2】:

    您可以使用圆形功能。这里有一些例子

    numpy.round([2.15295647e+01, 8.12531501e+00, 3.97113829e+00, 1.00777250e+01],2)
    array([ 21.53,   8.13,   3.97,  10.08])
    

    如果您只想更改显示表示,我会建议全局更改打印格式,如上面所建议的那样。我会就地格式化我的输出。

    >>a=np.array([2.15295647e+01, 8.12531501e+00, 3.97113829e+00, 1.00777250e+01])
    >>> print([ "{:0.2f}".format(x) for x in a ])
    ['21.53', '8.13', '3.97', '10.08']
    

    【讨论】:

    • 应该注意的是,如上所述,这会改变表示,而不仅仅是大多数用户可能想要的显示值。
    • @RamonMartinez 你是对的。我发布这个是因为我不喜欢像之前建议的那样在全球范围内更改打印格式的想法。稍后在程序的另一部分中,您可能会得到 0.00 并在 stackoverflow 创建新主题,为什么会发生这种情况。所以在这种情况下,我将简单地使用 ["{:0.2f}".format(x) for x in a],其中 a 是 numpy 数组或任何其他可迭代对象(列表、元组......)。在这种情况下,您无需更改其他打印格式。
    【解决方案3】:

    您混淆了实际精度和显示精度。十进制舍入不能用二进制精确表示。你应该试试:

    > np.set_printoptions(precision=2)
    > np.array([5.333333])
    array([ 5.33])
    

    【讨论】:

    • 这部分解决了我的问题,我仍然得到 e+01(就像 2.15e+01 而不是 21.5)。
    • @kaly Hm,您可能只想编写自己的格式化程序 (np.set_printoptions(formatter={float: float_formatting_function}))。
    【解决方案4】:
    [ round(x,2) for x in [2.15295647e+01, 8.12531501e+00, 3.97113829e+00, 1.00777250e+01]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-05
      • 1970-01-01
      • 2019-10-03
      • 1970-01-01
      • 1970-01-01
      • 2016-10-04
      相关资源
      最近更新 更多