2016-08-06 4 views
0

numpy.fromfileの単一の呼び出しを使用して読みたいバイナリには、さまざまなブロックがあります。各ブロックの形式は次のとおりです。ここでは、バイナリの形式であるnumpy.fromfileを使用して分散バイナリデータを読み取る

OES=[ 
('EKEY','i4',1), 
('FD1','f4',1), 
('EX1','f4',1), 
('EY1','f4',1), 
('EXY1','f4',1), 
('EA1','f4',1), 
('EMJRP1','f4',1), 
('EMNRP1','f4',1), 
('EMAX1','f4',1), 
('FD2','f4',1), 
('EX2','f4',1), 
('EY2','f4',1), 
('EXY2','f4',1), 
('EA2','f4',1), 
('EMJRP2','f4',1), 
('EMNRP2','f4',1), 
('EMAX2','f4',1)] 

Data I want (OES format repeating n times) 
------------------------ 
Useless Data 
------------------------ 
Data I want (OES format repeating m times) 
------------------------ 
etc.. 

私は私が欲しいデータと無駄なデータ間のバイト増分を知っています。私はまた、私が望む各データブロックのサイズを知っています。

これまでのところ、私は、ファイルオブジェクトfに追求して、呼び出すことによって、私の目標を達成しています

nparr = np.fromfile(f,dtype=OES,count=size) 

だから私は、私がしたい各データブロックに対して異なるnparrを持っており、一つにすべてnumpyの配列を連結します新しい配列。

私の目標は、(メモリの目的で)連結せずに必要なすべてのブロックを持つ単一の配列を持つことです。つまり、私はnparr = np.fromfile(f,dtype=OES)に一度だけ電話したいと思う。この目標を達成する方法はありますか?

答えて

2

つまり、私はnparr = np.fromfile(f,dtype=OES)に一度だけ電話したいと思います。この目標を達成する方法はありますか?

いいえ、fromfile()への一回の呼び出しではありません。

しかし、事前にファイルの完全なレイアウトが分かっている場合は、アレイを事前に割り当ててから、OESブロックを事前に割り当てられたアレイに直接読み取るためにfromfileseekを使用できます。たとえば、各OESブロックのファイル位置を知っており、各ブロックのレコード数を知っているとします。それはあなたが知っている、次のとおりです。

file_positions = [position1, position2, ...] 
numrecords = [n1, n2, ...] 

その後、あなたはこのような何かを行うことができます(fと仮定すると、すでにオープンされたファイルです):

total = sum(numrecords) 
nparr = np.empty(total, dtype=OES) 
current_index = 0 
for pos, n in zip(file_positions, numrecords): 
    f.seek(pos) 
    nparr[current_index:current_index+n] = np.fromfile(f, count=n, dtype=OES) 
    current_index += n 
+0

はどうもありがとうございました!私もこれを考慮していました。私はメモリがどのように管理されているのか少しばかげている。これは、np.fromfileとnparrから重複したメモリを生成しませんか? nparrサブセットはnp.fromfileのビューですか?またはコピー?私のテストに基づいて、そのようなアイテムの割り当てがコピーを作成しているようです。私はおそらく間違っています。すばらしい提案をありがとう。 – snowleopard

+1

各ブロックに対して、 'fromfile(f、count = n、dtype = OES)'は長さ 'n'の配列を作成します。その配列は 'nparr'の適切な範囲にコピーされます。 'fromfile'で作成された配列は他の場所には割り当てられていないので、そのメモリはPythonで再利用できるようになっています。 –

+0

あなたは利用できないことを意味しましたか? Pythonのガベージコレクタに関する私の読書に基づいて、あなたが意味していたことが完全に理解できるでしょう。 – snowleopard

関連する問題