2011-02-01 10 views
2

javaまたはclojureを使用してバイナリファイルから浮動小数点値を読み取る方法に関するアドバイスはありますか?現在の値をPythonのNumPyのnump.fromfile('path', dtype="f")メソッドの結果と比較していますが、私は単純に同じ答えを得ていません。NumPyとClojure/Javaの間の浮動小数点数の相違

4バイトの入力データを読み込んで、 float値を返します。私は、this documentationショーのようにJavaのDataInputStream.readFloat()方法は、バイナリファイルはJavaで書かれたことを前提としているため、これがあると思われます。これは最初に のint値を正確に のreadIntメソッドの方法で構築し、次に のfloat.intBitsToFloatメソッドと全く同じ方法でこのint値をfloat に変換します。このメソッドは、 によって書き込まれたバイトを読み取るのに適した です。 DataOutputのwriteFloatメソッドです。

だから、私はJavaが浮動小数点値を逆方向に読み込んでいると思います。最初の12バイトは、次のとおりですnumpyのとPythonを繰り返し-999.0として、それを見ながら

(0 -64 121 -60 0 -64 121 -60 0 -64 121 -60) 

のClojure/Javaは、繰り返し1.7676097E-38としてこれを見ています。参考までに、this datasetを使用しています。

答えて

6

Javaはjava.ioで "ネットワークオーダー"(ビッグエンディアン)を使用します。ただしjava.nioのは、あなたが適用するエンディアンかを選択することができます:

user=> (-> (map byte [0 -64 121 -60]) byte-array java.nio.ByteBuffer/wrap 
     (.order java.nio.ByteOrder/LITTLE_ENDIAN) .getFloat) 
-999.0 

あなたはどちらかのバイト配列内の全ファイルを読み込んだり、FileInputStreamからFileChannelを作成するには、それをのmmapしてから読み込まれるため、次のステップ結果として生じたmmaped ByteBuffer.getFloatを使用します。

+0

cgrandこれはすばらしく動作します。私は今、私にファイルへのアクセスを与えるByteBufferを持っています。次の質問は、バイトバッファを3Dマトリックスとして扱う方法です。 –

+1

スパースかどうか読み取り専用、永続性または変更可能? – cgrand

0

ファイルをバイトとして読み込み、エンディアンを変更し、それらのバイトをインメモリストリームに書き込み、DataInputStreamを再び使用してフロートとして読み込むことができます。

0

データセットはnetCDF形式で利用できるようです。 Python + numpyとjavaの両方のnetCDFライブラリがあります。これらのライブラリは、移植性の問題のほとんどすべてを解決し、おそらくパフォーマンスに大きな影響を与えません。

数値をファイルに保存することは、ほぼ解決済みの問題です。あなたがエンジニアリングを楽​​しんでいない限り、エンディアンが重要なレベルで働く必要はありません。

+0

私が参照したデータセットは2.5度のデータでしたが、実際には0.5度のデータをオープンしようとしていましたが、バイナリでしか利用できませんでした:ftp://ftp.cpc .ncep.noaa.gov/precip/50yr/gauge/0.5deg/ –

関連する問題