格式化numpy数组中的浮动

Kal*_*aly 51 python arrays numpy

如果我有这样的numpy数组:

[2.15295647e+01, 8.12531501e+00, 3.97113829e+00, 1.00777250e+01]
Run Code Online (Sandbox Code Playgroud)

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

[21.53, 8.13, 3.97, 10.08]
Run Code Online (Sandbox Code Playgroud)

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

ali*_*i_m 68

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

In [1]: float_formatter = "{:.2f}".format
Run Code Online (Sandbox Code Playgroud)

f这里指定点格式(不是"科学"),以及.2手段小数点后两位(你可以阅读更多关于字符串格式化这里).

让我们用浮点值测试它:

In [2]: float_formatter(1.234567E3)
Out[2]: '1234.57'
Run Code Online (Sandbox Code Playgroud)

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

In [3]: np.set_printoptions(formatter={'float_kind':float_formatter})
Run Code Online (Sandbox Code Playgroud)

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

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

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

In [5]: np.pi
Out[5]: 3.141592653589793
Run Code Online (Sandbox Code Playgroud)

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

您还应该知道,这只会影响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)
Run Code Online (Sandbox Code Playgroud)

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

如果你真的想以一种影响它们在计算中使用方式的方式对数组中的值进行舍入,你应该np.round像其他人已经指出的那样使用它.

  • 如何使其也适用于标量? (2认同)

U2E*_*EF1 31

你会混淆实际精度和显示精度.十进制舍入不能完全用二进制表示.你应该试试:

> np.set_printoptions(precision=2)
> np.array([5.333333])
array([ 5.33])
Run Code Online (Sandbox Code Playgroud)

  • @kaly Hm,您可能只想编写自己的格式化程序(`np.set_printoptions(formatter = {float:float_formatting_function})`). (4认同)

rth*_*rth 26

你可以使用圆形功能.这里有一些例子

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

如果你想改变只显示表示,我建议全局改变打印格式,如上所述.我会格式化我的输出.

>>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']
Run Code Online (Sandbox Code Playgroud)