【问题标题】:limit how much data is read with numpy.genfromtxt for matplotlib限制使用 numpy.genfromtxt 为 matplotlib 读取多少数据
【发布时间】:2014-12-21 23:45:52
【问题描述】:

我正在 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    
.
.
.

【问题讨论】:

    标签: python numpy matplotlib


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 2014-09-16
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      • 1970-01-01
      • 2016-05-31
      相关资源
      最近更新 更多