2014-06-10 40 views
-1

我有一個csv文件,像頭:避免在loadtxt指數值

鑑於此test.csv文件:

"A","B","C","D","E","F","timestamp" 
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291111964948 
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291113113366 
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291120650486 

如果,我用load.txt然後我得到3行7列與陣列exponential值。

r1 = numpy.loadtxt(open("test.csv","rb"),delimiter=",",skiprows=1) 

我得到

[[ 6.11882430e+02 9.08956010e+03 5.13300000e+03 8.64075140e+02 
    1.71537476e+03 7.65227770e+02 1.29111196e+12] 
    [ 6.11882430e+02 9.08956010e+03 5.13300000e+03 8.64075140e+02 
    1.71537476e+03 7.65227770e+02 1.29111311e+12] 
    [ 6.11882430e+02 9.08956010e+03 5.13300000e+03 8.64075140e+02 
    1.71537476e+03 7.65227770e+02 1.29112065e+12]] 

爲了避免exponential我用下面的代碼但仍給出了同樣的指數值。我的代碼,以避免指數:

r1 = np.loadtxt(open("test.csv","rb"),delimiter=",", dtype=np.float64, skiprows=1) 

有什麼辦法去除exponential在創建numpy的矩陣?我知道我可以在後面用numpy.savetxt(sys.stdout, r1, '%5.2f')刪除這些值,但是我希望在創建矩陣後創建矩陣。

+0

611.88243 *爲* 6.11882430e + 02,給出浮點運算相關的問題)。你不想讀取這些值嗎?否則,你在尋找什麼樣的結果?另外,你想要對最後一列輸入做什麼,它已經是指數表示法(1.291111964948E12)? –

+1

它爲什麼重要?除了顯示方式之外,還有什麼區別嗎? –

+0

@JoshuaTaylor查看我的編輯,在csv文件中不會有任何指數值。 – user2481422

回答

2

我希望對問題的評論清楚表明,這純粹是一個格式問題。另外在評論中指出,一些對numpy的陣列格式選項一個很好的解釋是@unutbu這裏給出:How to pretty-printing a numpy.array without scientific notation and with given precision?

在回答未顯示的選項是使用formatter參數np.set_printoptions的。在numpy 1.7.0版中,參數被添加到set_printoptions。通過參數formatter,您可以控制numpy如何打印數組的元素。以下是使用該參數控制浮點數格式的示例。

下面是如何a印有默認設置:

In [30]: a 
Out[30]: 
array([[ 6.11882430e+02, 9.08956010e+03, 5.13300000e+03, 
      8.64075140e+02, 1.71537476e+03, 7.65227770e+02, 
      1.29111196e+12], 
     [ 6.11882430e+02, 9.08956010e+03, 5.13300000e+03, 
      8.64075140e+02, 1.71537476e+03, 7.65227770e+02, 
      1.29111311e+12], 
     [ 6.11882430e+02, 9.08956010e+03, 5.13300000e+03, 
      8.64075140e+02, 1.71537476e+03, 7.65227770e+02, 
      1.29112065e+12]]) 

現在覆蓋默認設置,並告訴numpy的浮點值轉換爲使用格式"%.5f"字符串。這種格式不會使用科學記數法,並且在小數點後總是顯示五位數字。

In [31]: np.set_printoptions(formatter={'float': lambda x: "%.5f" % (x,)}) 

In [32]: a 
Out[32]: 
array([[611.88243, 9089.56010, 5133.00000, 864.07514, 1715.37476, 
     765.22777, 1291111964948.00000], 
     [611.88243, 9089.56010, 5133.00000, 864.07514, 1715.37476, 
     765.22777, 1291113113366.00000], 
     [611.88243, 9089.56010, 5133.00000, 864.07514, 1715.37476, 
     765.22777, 1291120650486.00000]]) 

您可以添加一個調用rstrip刪除尾隨零:

In [53]: np.set_printoptions(formatter={'float': lambda x: ("%.5f" % (x,)).rstrip('0')}) 

In [54]: a 
Out[54]: 
array([[611.88243, 9089.5601, 5133., 864.07514, 1715.37476, 765.22777, 
     1291111964948.], 
     [611.88243, 9089.5601, 5133., 864.07514, 1715.37476, 765.22777, 
     1291113113366.], 
     [611.88243, 9089.5601, 5133., 864.07514, 1715.37476, 765.22777, 
     1291120650486.]]) 

注意,在上面,我在ipython輸入名稱,並回顯其價值。當以這種方式使用時,將打印對象的表示。你會得到str - 表示,如果你明確地打印:

In [55]: print a 
[[611.88243 9089.5601 5133. 864.07514 1715.37476 765.22777 1291111964948.] 
[611.88243 9089.5601 5133. 864.07514 1715.37476 765.22777 1291113113366.] 
[611.88243 9089.5601 5133. 864.07514 1715.37476 765.22777 1291120650486.]] 
+0

你的答案給出了這個錯誤TypeError:set_printoptions()有一個意想不到的關鍵字參數'formatter'。 – user2481422

+0

@ user2481422:'formatter'參數已添加到numpy 1.7.0(https://github.com/numpy/numpy/blob/master/doc/release/1.7.0-notes.rst#custom-formatter-for - 印刷陣列)。你使用什麼版本? –

+0

我正在使用1.6.2 – user2481422