2017-06-16 8 views
0

誤ったデータ型を使用して格納されたデータがあり、基礎となるデータを正しい値に再解析するのに問題があります。データポイントは実際には浮動小数点数であり、制御できないシステムには単一の整数(おそらく32ビット)として格納されます。私がアクセスできるのは単一の整数です。私はPython 2で正しい値を得るためfloat32として再解釈したいと思います。私はview()neworderbytes()関数を使用していましたが、予期しない結果が出ています。numpy view()関数を使用して誤って格納されたデータを再解析する際の問題

通常の整数データは[-2147483648, 875967683, 1005249947, 1216348160]で、-1と+1の間の浮動小数点数を返します。だから、

>>> import numpy as np 
>>> si = np.array([-2147483648, 0, 875967683, 1005249947, 1084227584, 1084231267, 1112226524, 1216348160], dtype=np.int32) 
>>> si.view(np.float32) 
array([ -0.00000000e+00, 0.00000000e+00, 1.69692655e-07, 
    7.16848439e-03, 5.00000000e+00, 5.00175619e+00, 
    5.08074799e+01, 2.62144000e+05], dtype=float32) 
>>> si.view(np.float32).newbyteorder() 
array([ 1.79366203e-43, 0.00000000e+00, -1.80211731e+02, 
    -3.80362399e-22, 5.74868682e-41, 2.63098489e+21, 
    -2.09748370e+17, 4.60186416e-41], dtype=float32) 

、あなたが再解釈することを参照してください。これらの制限は、浮動小数点数は、以下の例を参照してください、私が取得しています何をしている、わずかに高いまたは低いが、1E5として確かに高くはないかもしれないので、ハードではありませんデータが私の期待に合わない。さらに、私の興味をそそる整数の分布にはいくつかの特質があり、おそらく私はすべてのことを私の側でやっていると思いますが、その基礎となるデータは保管プロセスで破損していると思います。

は、ここで私が持っているものです。

Total number of integers   : 321,767 
Number of integers = -2,147,483,648 : 91,989 
Number of integers =    0 : 163,356 
Number of integers >    0 : 66,422 

だから、-2147483648、唯一負の数と正確に一致したデータの重要な部分があります。半分は正確に0で、完全に細かく正常です。残りは875,967,683と1,216,348,160の間で変わっています。データをソートしてvsインデックスをプロットしたプロット(http://i.imgur.com/jJVr1t6.png)を参照してください。ヒストグラム私はヒストグラムの正規分布を期待しましたが、明らかにそうではありません。

私の基本的な質問は次のとおりです。view()機能を正しく使用して正しい状況(データが壊れていることを意味する)にしていないか、そうではありませんか?

+0

私は、-2,147,483,648が「Nan」を表すために使用されていると考えています。残りの数字は、オフセットとスケーリングが必要です。例えば、 'offset = 1 << 30;分母= 1 << 31;浮動小数点=(si - オフセット)/分母。 –

+0

はい、タイプミスが修正されました。ありがとう@ PM2Ring! 'view() 'は標準的なPython関数ではなくnumpy関数であることを定義するための質問を洗練してくれてありがとう。 –

+0

まあ、-2,147,483,648のint32の最小許容値(少なくともnumpyで)、私はそれが特別な値であることが理にかなっていることに同意します。 「ナン」はいい考えです。しかし、私は、データが異常に分散しているので、例えば、1,092,616,192と1,112,226,524の間のジャンプのため、翻訳とスケーリングが十分であるとは思わない。 –

答えて

0

私はそれを自分で解決したことが判明しました。データの私の基本的な前提と期待は間違っていたので、それはとても難しかった。 1つの特定のパラメータのデータをフィルタリングすると、numpyのview関数が実際に基礎となるバイトを正しく再解析したことがわかりました。実際にはこれらの値は+-0.2にハード制限されています。 :

>>> np.array([950355002, 1045220557], dtype=np.int32).view(np.float32) 
array([ 7.88052130e-05, 2.00000003e-01], dtype=float32) 

大きな数は正確に私の上部ハードリミットである再解釈0.2、すなわち。小さい数字は事実上0であり、期待される数字は-0.2ではありません。 したがって、私のデータはfloat32の代わりにint32として間違って格納されていますが、何らかの理由で負の(浮動小数点)データが失われ、デフォルトの-2,147,483,648値として格納されている可能性が高いと確信しています。

関連する問題