我正在處理存儲在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')])
,正確嗎?
我得到一個相關的'MemoryError'與字符串'join'幾百萬行。相反,我將我的readline文件輸入提供給'StringIO'緩衝區以傳遞給'np.loadtxt'(我需要通過readline預處理輸入來查找相關部分)。所有偉大的提示,謝謝! – 2011-04-14 22:30:45
注意:'np.fromiter'示例不能按預期工作,原因不明。 – 2011-04-17 05:59:41