2014-03-04 125 views
1

我使用numpy savetxt()將矩陣的元素保存爲單個文件(我需要按順序打印大量文件)。這方法我發現:numpy savetxt:將矩陣保存爲行

import numpy as np 

mat = np.array([[1,2,3], 
       [4,5,6], 
       [7,8,9]]) 

with open('myfile.dat','a') as handle: 
    np.savetxt(handle, mat.reshape(1,mat.size), fmt='%+.8e') 
handle.close() 

有2個問題:

1)是savetxt()最好的選擇?我需要打印1e5到1e7這些東西......我不希望I/O瓶頸實際計算。我猜測每次迭代重新開放文件是一個糟糕的計劃,速度明智。

2)理想的情況下我會印開始的每一行,所以我的輸出可能看起來像一些背景資料:

(N foo mat): 

... 
6 -2.309 +1.000 +2.000 ... 
7 -4.273 +1.000 +2.000 ... 
8 -3.664 +1.000 +2.000 ... 
... 

我可以做到這一點使用np.append(),但隨後的第一個號碼不會打印作爲INT。 savetxt()直接可以做這種事嗎?或者我需要一個類似C的fprintf()

回答

0

好的。作爲數組打印的原始代碼僅適用於打印一次的情況。 mat.reshape()方法不只是返回改變後的矩陣,它本身也改變了。這意味着下次通過循環時,任何linalg例程都將失敗。

爲了避免這種情況,我們需要重塑的mat。爲了清晰起見,我還添加了tmp變量。

import numpy as np 

mat = np.array([[1,2,3], 
       [4,5,6], 
       [7,8,9]]) # initialize mat to see format 

handle = open('myfile.dat', 'ab') 
for n in range(N): 
    # perform linalg calculations on mat ... 
    meta = foo # based on current mat 

    tmp = np.hstack(([[n]], [[meta]], (mat.copy()).reshape(1,mat.size))) 
    np.savetxt(handle, tmp, fmt='%+.8e') 

handle.close() 

這得到上下文數據nmeta在這種情況下。我可以將n保存爲float

我做了一些基準檢查來檢查I/O成本。我設置N = 100000的循環,並且平均爲6次運行時間:

  • 沒有I/O,就計算:9.1秒
  • 如上編碼:17.2秒
  • 開放「MYFILE。 dat'來追加每次迭代:30.6秒

因此,I/O使運行時加倍,並且如預期的那樣不斷打開和關閉文件是一個糟糕的計劃。

0

大熊貓具有良好的to_csv方法:

import pandas as pd 
import numpy as np 

mat = np.array([[1,2,3], 
       [4,5,6], 
       [7,8,9]]) 
df = pd.DataFrame(data=mat.astype(np.float)) 
df.to_csv('myfile.dat', sep=' ', float_format='%+.8e', header=False) 

默認情況下,它會添加索引(index=True),但如果你想不同的上下文數據你可以只添加到您的數據幀,將index=False

$ cat myfile.dat 
0 +1.00000000e+00 +2.00000000e+00 +3.00000000e+00 
1 +4.00000000e+00 +5.00000000e+00 +6.00000000e+00 
2 +7.00000000e+00 +8.00000000e+00 +9.00000000e+00 
+0

它看起來不像'to_csv'可以追加到現有文件上。這意味着我必須在RAM中攜帶一個潛在的巨大數據幀並將其轉儲到文件末尾。我想我可以嘗試這種可行性... –

+0

看看http://stackoverflow.com/問題/ 17530542/how-to-add-pandas-data-to-an-existing-csv-file – YXD

+0

我明白了。現在我對'savetxt'解決方案感到滿意。將矩陣複製到DataFrame中以便打印它似乎有點迂迴。 –