12

ソースデータ用のテキストファイルとグラフをプロットするためのmatplotlibを使用して、Pythonでグラフを作成しています。以下の単純なロジックはうまく機能します。

しかし、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')

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

2 に答える 2

12

numpy.genfromtxtファイルだけでなくイテレータも受け入れます。これは、の出力を受け入れることを意味しますitertools.islice。これtest.txtが5行のファイルです。

>>> 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
于 2012-12-01T21:17:52.683 に答える
0

numpyについてはわかりませんが、考えられる解決策の1つは、stringioクラスを使用することです。

これにより、実際に必要なデータを通常のファイルIO(バイトバージョンもあります)の文字列にロードし、文字列からファイルのようなオブジェクトを作成して、それをnumpyに渡すことができます。

于 2012-12-01T21:46:24.100 に答える