月曜日, 8月 24, 2009

バイナリファイルからndarrayにデータを読み込む

最近、仕事で計測したデータの簡単な解析をするのに、Pythonで簡単なスクリプトを書いてこなしていましたが、現在計画している、もっと大規模な解析もPythonでやってみよう、という運びになりました。んで、お盆休みとかも適当に関連サイトを眺めてはいろいろ考えていましたが、お盆休み明けの今日(自分基準)は実際にテストコードを書いては確認する作業に専念致しました。

最初に問題にしたのは、バイナリで書かれたデータファイルをどう読むかです。 これまでは、考えるのが面倒でしたのでstructを使って、

x1 = struct.unpack('H', f.read(struct.calcsize('H')))[0]
みたいな感じでちまちまとデータを読んでnumpy.ndarrayに代入しておりました。ndarrayにもファイルから直接読み込むfromfileメソッドがありますが、直接ファイル名を与えて頭から読み込む仕様になっていて、ファイルオブジェクトを開いて適当にシークした所から読み込む、等の様な使い方ができないので弱っておりました。

こちら(*1)によると、Scipyfreadメソッドを使うと良さげです。しかし実際に動かしてみるとdeprecatedと警告が出て気持ちが悪いです。もう少し調べますと(*2)scipy.io.numpyiofreadメソッドを使うことになっているようです。これで問題なくシークしながらバイナリデータをたくさん読み込めます。

もっとも実際にベンチマークを取ってみますと、ファイルの読み込みはあまりオーバーヘッドになっていませんでした。それでも、プログラムの設計上このような選択肢があった方が都合が良かったのです。

*1 http://scipy.dip.jp/index.php?SciPy%2FIO
*2 http://www.scipy.org/Cookbook/InputOutput

0 件のコメント: