NumPy: загрузка разнородных столбцов данных из списка строк - PullRequest
2 голосов
/ 14 апреля 2011

Я работаю с данными массива, хранящимися в файле ASCII (аналогично этой теме ). Мой файл занимает не менее 2 миллионов строк (158 МБ) и разделен на несколько разделов с разными схемами. В моем модуле для чтения формата я хочу прочитать весь файл через lines = open('myfile.txt', 'r').readlines(), чтобы я мог индексировать позиции каждого раздела, а затем читать каждый нужный мне раздел в структурах данных 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')]), правильно?

1 Ответ

3 голосов
/ 14 апреля 2011

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')]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...