2014-01-08 97 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