2012-12-01 12 views
12

के लिए numpy.genfromtxt के साथ कितना डेटा पढ़ा गया है, मैं ग्राफ़ को साजिश करने के लिए स्रोत डेटा और matplotlib के लिए टेक्स्ट फ़ाइल का उपयोग करके पायथन में एक ग्राफ बना रहा हूं। नीचे सरल तर्क अच्छी तरह से काम करता है।matplotlib

लेकिन क्या numpy.gentfromtxt फ़ाइल 'तापमान_लॉगिंग' से पहले 50 लाइनों को पढ़ने के लिए कोई तरीका है? वर्तमान में यह पूरी फाइल पढ़ता है।

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

तापमान_लॉगिंग में सामग्री;

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

उत्तर

12

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 फ़ाइल आईओ को संभालने की तुलना में धीमी होगी, लेकिन एक त्वरित परीक्षण अन्यथा पता चलता है। 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 
+0

बहुत काउंटर सहज ज्ञान युक्त! क्या किसी को पता है कि ये क्यों हो रहा है? – fakedrake

0

नहीं numpy के बारे में विचार है, लेकिन एक संभव समाधान stringio वर्ग का उपयोग करने के लिए होगा।

यह आपको सामान्य फ़ाइल IO (एक बाइट संस्करण भी) के साथ वास्तव में एक स्ट्रिंग में आवश्यक डेटा को लोड करने की अनुमति देता है, स्ट्रिंग से फ़ाइल जैसी ऑब्जेक्ट बनाएं और उसे निष्क्रिय करें।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^