2011-04-14 3 views
2

ASCII 파일에 저장된 배열 데이터로 작업하고 있습니다 (this thread과 유사). 내 파일은 적어도 2M 줄 (158MB)이며 다른 스키마가있는 여러 섹션으로 나뉩니다. 형식을 읽는 모듈에서 lines = open('myfile.txt', 'r').readlines()을 통해 전체 파일을 읽으므로 각 섹션의 위치를 ​​인덱싱하고 NumPy 데이터 구조에 필요한 각 섹션을 읽을 수 있습니다.NumPy : 문자열 목록에서 이질적인 데이터 열로드

예를 들어, 섹션 중 하나 발췌입니다

>>> 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'] 

어떻게 신속 I 할 수 있습니다 것 스키마 [int, float, float, float, float, float, float, float, float]하고, 나중에 부분이

>>> 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] 스키마이 NumPy로 라인의 다른 섹션에로드? np.loadtxt이 있지만 파일 핸들이 필요하며 끝까지 읽습니다. 나는 또한 np.from* 기능을 볼 수 있지만, 이미 내 이미 lines와 함께 그들을 사용하는 방법을 잘 모르겠습니다. 파일을 두 번 읽어야합니까?

이기종 데이터 유형에 관해서는 np.dtype([('col1', '<i2'), ('col2', 'f4'), ('col3', 'f4'), ('col4', 'f4'), ('col5', 'f4'), ('col6', 'f4'), ('col7', 'f4'), ('col8', 'f4'), ('col9', 'f4')])과 같이 dtype의 화합물을 사용할 수 있습니다. 맞습니까?

답변

3

StringIO은 문자열에서 파일 유형 개체를 만들 수 있습니다. 그래서 당신은 내가 만 몇 줄의 문자열`join`와 관련된`MemoryError`을 얻고 있었다

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

를 수행

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

또는 더 쉽게 할 수 있습니다. 그래서 대신에'readIO' 파일 입력을'StringIO' 버퍼에 보내서'np.loadtxt'로 넘깁니다 (관련 섹션을 찾기 위해 readline을 통해 입력을 사전 처리해야합니다). 모든 위대한 팁, 감사합니다! –

+0

참고 : 'np.fromiter' 예제는 알 수없는 이유로 예상대로 작동하지 않습니다. –

관련 문제