2012-12-01 11 views
12

Sto creando un grafico in python utilizzando un file di testo per i dati di origine e matplotlib per tracciare il grafico. La semplice logica di seguito funziona bene.limitare la quantità di dati letti con numpy.genfromtxt per matplotlib

Ma c'è un modo per ottenere numpy.gentfromtxt solo leggere le prime 50 righe dal file 'temperature_logging'? Attualmente legge l'intero file.

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

contenuto in 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  
. 
. 
. 

risposta

12

numpy.genfromtxt accetta iteratori così come i file. Ciò significa che accetterà l'output di itertools.islice. Qui, test.txt è un file di cinque righe:

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

Si potrebbe pensare che questo sarebbe più lento di lasciare numpy gestire il file IO, ma un test rapido suggerisce il contrario. genfromtxt fornisce un argomento skip_footer parola chiave che è possibile utilizzare se si sa per quanto tempo il file è ...

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

... ma alcuni test informali su un file 1000-line suggeriscono che l'uso di islice è più veloce, anche se si salta solo poche righe:

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

Molto contro intuitivo! Qualcuno sa perché questo sta accadendo? – fakedrake

0

Nessuna idea su NumPy, ma una possibile soluzione sarebbe quella di utilizzare la classe stringio.

Ciò consente di caricare semplicemente i dati effettivamente necessari in una stringa con il file normale IO (esiste anche una versione byte), creare un oggetto simile a un file dalla stringa e passarlo a numpy.

Problemi correlati