2011-04-14 45 views
2

我正在處理存儲在ASCII文件中的數組數據(類似於this thread)。我的文件至少有2百萬行(158 MB),並且分爲不同模式的多個部分。在我讀取格式的模塊中,我想通過lines = open('myfile.txt', 'r').readlines()讀取整個文件,這樣我就可以索引每個部分的位置,然後將每個需要的部分讀入NumPy數據結構。NumPy:從字符串列表中加載異質列數據

例如,部分的一個摘錄:

>>> print lines[5:10] 
['  1 0.1000 0.300E-03 0.000E+00 0.300E-03 0.000E+00 0.000E+00 0.300E-03 0.100E-03\n', 
'  2 0.1000 0.120E-02 0.000E+00 0.120E-02 0.000E+00 0.000E+00 0.120E-02 0.100E-03\n', 
'  3 0.1000 0.100E-02 0.000E+00 0.100E-02 0.000E+00 0.000E+00 0.100E-02 0.100E-03\n', 
'  4 0.1000 0.110E-02 0.000E+00 0.110E-02 0.000E+00 0.000E+00 0.110E-02 0.100E-03\n', 
'  5 0.1000 0.700E-03 0.000E+00 0.700E-03 0.000E+00 0.000E+00 0.700E-03 0.100E-03\n'] 

其中有模式[int, float, float, float, float, float, float, float, float],以及稍後的部分將有一個簡單的[int, float]模式:

>>> print lines[20:25] 
['  1   0.00000E+00\n', 
'  2   0.43927E-07\n', 
'  3   0.44006E-07\n', 
'  4   0.44020E-07\n', 
'  5   0.44039E-07\n'] 

如何快速用NumPy加載不同部分的行?我看到有np.loadtxt,但它需要一個文件句柄,並一直讀到最後。我也看到np.from*功能,但我不知道如何使用它們與我已閱讀lines。我需要兩次讀取文件嗎?

關於異構數據類型,我想我可以使用複合dtype,如np.dtype([('col1', '<i2'), ('col2', 'f4'), ('col3', 'f4'), ('col4', 'f4'), ('col5', 'f4'), ('col6', 'f4'), ('col7', 'f4'), ('col8', 'f4'), ('col9', 'f4')]),正確嗎?

回答

3

StringIO可以從字符串中創建文件類型的對象。所以,你可以做

from StringIO import StringIO 
m = np.loadtxt(StringIO('\n'.join(lines[5:10]))) 

或者更簡單,做

m = np.fromiter(lines[5:10],np.dtype([('col1', '<i2'), ('col2', 'f4'), ('col3', 'f4')])) 
+0

我得到一個相關的'MemoryError'與字符串'join'幾百萬行。相反,我將我的readline文件輸入提供給'StringIO'緩衝區以傳遞給'np.loadtxt'(我需要通過readline預處理輸入來查找相關部分)。所有偉大的提示,謝謝! – 2011-04-14 22:30:45

+0

注意:'np.fromiter'示例不能按預期工作,原因不明。 – 2011-04-17 05:59:41

相關問題