2014-01-08 73 views
30

如果我有一个numpy的数组是这样的:格式化漂浮在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]我不想要的,我还没有找到另一种方式来做到这一点。

+0

可能的重复[如何漂亮打印numpy.array没有科学记数法和给定的精度?](http://stackoverflow.com/questions/2891790/how-to-pretty-printing-a-numpy- array-without-scientific-notation-and-with-given) –

回答

43

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

In [1]: float_formatter = lambda x: "%.2f" % x 

这里的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] 

注意th在此仅影响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,正如其他人已经指出的那样。

0
[ round(x,2) for x in [2.15295647e+01, 8.12531501e+00, 3.97113829e+00, 1.00777250e+01]] 
13

您可以使用轮功能。这里是一些例子

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'] 
+0

应该注意,因为它是在上面,这改变了表示,而不仅仅是大多数用户可能打算的显示值。 –

+0

@RamonMartinez你是对的。我之所以发布这篇文章是因为我不喜欢这个想法在全球范围内改变打印格式,正如之前的建议。稍后在程序的另一部分,您可能会得到0.00,并在stackoverflow中创建新主题,为什么会发生这种情况。所以在这种情况下,我会简单地使用[“{:0.2f}”.format(x)for x in a],其中a是numpy数组或其他可迭代对象(list,tuple ....)。在这种情况下,您不会更改其他打印格式。 – rth

23

您正在混淆实际精度和显示精度。十进制舍入不能完全用二进制表示。你应该尝试:

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

这部分解决了我的问题,我仍然得到e + 01(如2.15e + 01而不是21.5)。 – Kaly

+3

@kaly嗯,你可能只想写自己的格式化程序('np.set_printoptions(formatter = {float:float_formatting_function})')。 – U2EF1