Подтвердить что ты не робот

Ограничьте количество данных с помощью numpy.genfromtxt для matplotlib

Я создаю график в python, используя текстовый файл для исходных данных и matplotlib для построения графика. Простая логика ниже хорошо работает.

Но есть ли способ заставить numpy.gentfromtxt читать только первые 50 строк из файла "temperature_logging"? В настоящее время он считывает весь файл.

temp = numpy.genfromtxt('temperature_logging',dtype=None,usecols=(0))
time = numpy.genfromtxt('temperature_logging',dtype=None,usecols=(1))

dates = matplotlib.dates.datestr2num(time)

pylab.plot_date(dates,temp,xdate=True,fmt='b-')

pylab.savefig('gp.png')

содержимое в журнале температуры_logging;

21.75 12-01-2012-15:53:35    
21.75 12-01-2012-15:54:35    
21.75 12-01-2012-15:55:35    
.
.
.
4b9b3361

Ответ 1

numpy.genfromtxt принимает итераторы, а также файлы. Это означает, что он примет вывод itertools.islice. Здесь test.txt представляет собой пятистрочный файл:

>>> import itertools, numpy
>>> with open('test.txt') as t_in:
...     numpy.genfromtxt(itertools.islice(t_in, 3))
... 
array([[  1.,   2.,   3.,   4.,   5.],
       [  6.,   7.,   8.,   9.,  10.],
       [ 11.,  12.,  13.,  14.,  15.]])

Можно подумать, что это будет медленнее, чем позволить numpy обрабатывать файл IO, но быстрый тест предполагает иное. genfromtxt предоставляет аргумент ключевого слова skip_footer, который вы можете использовать, если знаете, как долго файл...

>>> numpy.genfromtxt('test.txt', skip_footer=2)
array([[  1.,   2.,   3.,   4.,   5.],
       [  6.,   7.,   8.,   9.,  10.],
       [ 11.,  12.,  13.,  14.,  15.]])

... но несколько неофициальных тестов в 1000-строчном файле предполагают, что использование islice выполняется быстрее, даже если вы пропустите только несколько строк:

>>> def get(nlines, islice=itertools.islice):
...     with open('test.txt') as t_in:
...         numpy.genfromtxt(islice(t_in, nlines))
...         
>>> %timeit get(3)
1000 loops, best of 3: 338 us per loop
>>> %timeit numpy.genfromtxt('test.txt', skip_footer=997)
100 loops, best of 3: 4.92 ms per loop
>>> %timeit get(300)
100 loops, best of 3: 5.04 ms per loop
>>> %timeit numpy.genfromtxt('test.txt', skip_footer=700)
100 loops, best of 3: 8.48 ms per loop
>>> %timeit get(999)
100 loops, best of 3: 16.2 ms per loop
>>> %timeit numpy.genfromtxt('test.txt', skip_footer=1)
100 loops, best of 3: 16.7 ms per loop

Ответ 2

Не знаю о numpy, но одним из возможных решений было бы использовать класс stringio.

Это позволяет вам просто загружать нужные вам данные в строку с обычным файловым IO (также есть байтовая версия), создавать файл-подобный объект из строки и передавать его на numpy.