2012-12-01 11 views
12

Tworzę wykres w pythonie, używając pliku tekstowego dla danych źródłowych i matplotlib do wykreślenia wykresu. Prosta logika poniżej działa dobrze.ograniczenie ilości danych odczytanych za pomocą numpy.genfromtxt dla matplotlib

Ale czy istnieje sposób na uzyskanie numpy.gentfromtxt tylko do odczytu pierwszych 50 linii z pliku "temperature_logging"? Obecnie czyta cały plik.

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

zawartość w temperature_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  
. 
. 
. 

Odpowiedz

12

numpy.genfromtxt akceptuje iteratory oraz plików. Oznacza to, że zaakceptuje wyjście z itertools.islice. Tutaj test.txt plik jest pięć linii:

>>> 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.]]) 

Można by pomyśleć, że będzie wolniejszy niż pozwolić numpy obsłużyć plik IO, ale szybkie badanie sugeruje inaczej. genfromtxt dostarcza argumentu skip_footer słów kluczowych, które można wykorzystać, jeśli wiesz, jak długo plik jest ...

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

... ale kilka nieformalne testy na linii pliku 1000 sugerują, że za pomocą islice jest szybsza nawet jeśli pominąć tylko kilka linii:

>>> 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 
+0

Bardzo intuicyjna obsługa! Czy ktoś wie, dlaczego tak się dzieje? – fakedrake

0

pojęcia o numpy, ale jednym z możliwych rozwiązań byłoby użyć klasy stringio.

Pozwala to po prostu załadować dane, które faktycznie potrzebujesz, do ciągu znaków z normalnym plikiem IO (jest też wersja bajtowa), utworzyć obiekt podobny do pliku z ciągu znaków i przekazać go do numpy.

Powiązane problemy