2017-02-23 16 views
0

私はこの質問に対する答えを見つけることができなかったのに驚いています。私は浮動小数点値をhdf5データセットに書いています。精度を10小数点に設定したいと思います。 hdf5データセットのdocumentationから、精度を設定する方法はありません。私が得た最も近いものは 'float32'か 'float64'ですが、 'float32'は私の数を減らしています。ファイルサイズは私の大きな懸念事項であり、 'float64'の不要な数字はファイルを大幅に大きくします。 hdf5で精度を選ぶことは可能ですか?hdf5データセットの浮動小数点精度を設定する

私の問題の例:あるデータの真の値が[0] 0.0066896507

group.create_dataset(name, data=data, dtype='float64') 

[0] 0.0066896506999999999が得られたデータが、

group.create_dataset(name, data=data, dtype='float32') 

ている私に0.0066896505を与える、と 間違っている。データセット内の他の数字はさらに間違っています。

私は

x = h5py.File(my_file,'r') 
print(x['dataset'][0]) 

を行うとき、それは私に正しい番号を与えるので、それは、また奇妙です。しかし、コンソールにx['dataset'][0]と入力するだけで、私が上記で書いたことが得られます。データは実際どのように保存されていますか?それは本当に余分な数字を与えていますか?ご覧のとおり、私はhdf5(そして一般的にはPython)に少し慣れています。助けてくれてありがとう。

+0

'float32'と' float64'は、ほとんどのコンパイラの標準フロート型です( 'c'コンパイラの' float'と 'double')。それらは、1つの番号につき4バイトと8バイトを使用します。プロセッサとコンパイラは、これらのサイズで効率的に動作するように設計されています。 6バイト(またはそれより悪い5または7)を使用しようとすると、メモリ使用量を大幅に削減することなく効率が大幅に低下します。 – hpaulj

+0

このhdf5ファイルを他の人に送信した場合、数字が10以上の精度で表示されますか? –

+1

これはストレージの問題ではなく、印刷精度の問題である可能性があります。 – hpaulj

答えて

1

カスタム精度タイプを作成するには、h5pyの低レベルのバインディング、具体的にはhttp://api.h5py.org/h5t.html#atomic-classesの関数/タイプにドロップする必要があります。これがどのように行われるかの例(ハーフ/ 16ビット浮動小数点数の場合)については、https://github.com/h5py/h5py/blob/master/h5py/h5t.pyx#L202を参照してください。

しかし、これはおそらくあなたが望むものではありません(小数点以下の桁数を参照)。ベース10ベースの浮動小数点数は存在しますが(例:https://en.wikipedia.org/wiki/Decimal64_floating-point_format参照)、実際には、すべての浮動小数点数はベース2です。これは、格納されているビット数(およびどの形式(https://en.wikipedia.org/wiki/IEEE_754#Basic_and_interchange_formatsを参照)か)を気にすることを意味します。また、精度があるよりも多くの数字を印刷することも可能です(たとえば、有効数字30桁の〜7桁の数値を格納するfloat32を印刷できますが、30桁の精度があることを意味するわけではありません)。したがって、少なくとも10桁の精度が重要であることに基づいて、float64(double、binary64とも呼ばれます)を使用する必要があります。

h5pyの圧縮を検討する価値がありますサポート、http://docs.h5py.org/en/latest/high/dataset.html#filter-pipelineを参照してください。

+0

ありがとうございます。私はそれが印刷の問題だと信じて、あなたの "正確なものよりも多くの桁を印刷する"声明に当てはまります。 –

関連する問題