使用numpy.genfromtxt为matplotlib限制读取的数据量

时间:2012-12-01 21:04:16

标签: python numpy matplotlib

我在python中创建一个图形,使用源数据的文本文件和matplotlib来绘制图形。 下面简单的逻辑运作良好。

但有没有办法让numpy.gentfromtxt只读取文件'temperature_logging'中的前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    
.
.
.

2 个答案:

答案 0 :(得分: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处理文件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

答案 1 :(得分:0)

不知道numpy,但一种可能的解决方案是使用stringio类。

这允许您只需将实际需要的数据加载到具有普通文件IO的字符串中(还有一个字节版本),从字符串中创建一个类似文件的对象并将其传递给numpy。