2012-05-10 27 views
8

numpyの浮動小数点配列の内容を、符号付き16ビット整数として生のバイナリファイルに保存したいとします。私はndarray.tofileを使ってこれを達成しようとしましたが、正しいフォーマット文字列を理解できません。ファイルは二重フォーマットで保存されているようですが、フォーマット文字列をどのように選ぶかによって異なります。これはどうすればいいですか?おかげさまで NumPyの配列データを持つ生のバイナリファイルを作成します。

答えて

19

私は

array.astype('int16').tofile(filename) 
+1

[numpyのドキュメント] (http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.ndarray.tofile.html)は、「エンディアンと精度に関する情報が失われている」と述べています。これはすべてのプラットフォームで動作するのですか? – Gilly

+3

'tofile'は、配列のメタデータではなく、配列の生のバイナリデータだけを書き込みます。典型的な使用例は、ファイルを開き、ファイルタイプに適したヘッダを書き、 'tofile'を使って生データを埋め込むことです。ヘッダーからメタデータ(エンディアン、精度、形状)を推測し、生データをそのプラットフォームに適した形式に変更するのは、ファイルを読み取るソフトウェアの責任です。メタデータがなければ、配列の生の内容を正しく解釈することはできません。 配列を読み書きするだけであれば、 "python hd5"かnumpy.saveを見てください。 –

+0

ありがとうございます!この特別なastypeは、np.array([]、dtype = np.int8)を指定して配列を作成した場合でも必要でした。 –

8

は、この例を試し、構造体のモジュールを見てみましょう、これを行う最も簡単な方法は、最初の配列はINT16に変換することだと思う:あなたがかもしれ

import struct 
import numpy 

f=open("myfile","wb") 
mydata=numpy.random.random(10) 
print(mydata) 
myfmt='f'*len(mydata) 
# You can use 'd' for double and <or> to force endinness 
bin=struct.pack(myfmt,*mydata) 
print(bin) 
f.write(bin) 
f.close() 
+10

経験に基づいて、私は** struct ** packの使用を強くお勧めします**。そのAPIでは、大規模な配列サイズの場合**のパフォーマンスに大きな影響を与える変数に配列をデマングルする必要があります(つまり、 '*'演算子を使用する)。配列の各要素は、その要素を指し示すようにスタック上に作成される新しい64ビット・ポインタ(64ビット・マシン上)を必要とします。このオーバーヘッドを避けるために 'tostring' /' tobytes'/'tofile'に固執してください。たとえば、私たちの場合、100 Mbの配列を扱っていたため、6.4 GbのRAMがあるので、 'struct.pack'はその作業を行うことができます。 –

0

Matlab形式のファイルに名前と配列の辞書を保存できるscipy.io.savematを使用してください:

import scipy.io as sio 
sio.savemat(filename, pydict) 

ここpydictは= { 'NAME1':np.array1、 '名前2':np.array2、...}かもしれ

あなただけの必要な辞書をロードするには:

pydict = sio.loadmat(filename) 
関連する問題