2017-09-07 42 views
1

NumPyで浮動小数点数の仮数と指数を抽出したいと考えています。指数を整数で取得するのは問題ありません。仮数部をビットフィールドとして取得することは、さらに便利になります。NumPyでの浮動小数点仮数と指数の抽出

私はPython浮動小数点数がhexメソッドを持っていることを知っています。しかし、numpy.float32、numpy配列、およびufuncsを使用したいと思います。私はまた、私は整数としてので、バイナリ文字列としてfloatを見ることができますnumpyのview方法を認識しています:大手0がドロップされるように、この方法で指数と符号を抽出

>>> import numpy as np 

>>> b = bin(np.float32(1.23456789).view(np.int32)) 
'0b111111100111100000011001010010' 

>>> b[-23:] # extract last 23 bits of IEEE 754 binary32 float, is significand 
'00111100000011001010010' 

は、便利ではありませんbin。 (私は0に32ビットに左パッドすることができました...)

いずれにしても、binはufuncではないので、これは便利ではありませんし、配列全体を反復処理する必要があります。

私がしたいことをするために、より便利なアプローチはありませんか?

+1

[この回答](https://stackoverflow.com/a/16444786/3214872)をご覧ください。それはあなたの方向を指すかもしれません – GPhilo

+1

@GPhilo:ありがとう。実際、その答えは、いいえ、それ以上の便利なアプローチがないことを明確にしているようです。 – equaeghe

+1

['numpy.frexp'](https://docs.scipy.org/doc/numpy/reference/generated/numpy.frexp.html)を見てください –

答えて

1

GPhilioさんのコメントはan answer to “extracting mantissa and exponent from double in c#”に基づいて、以下の溶液が得られたように、より徹底した検索をトリガー:

import numpy as np 

def decompose(x: np.float32): 
    """decomposes a float32 into negative, exponent, and significand""" 
    negative = x < 0 
    n = np.abs(x).view(np.int32) # discard sign (MSB now 0), 
           # view bit string as int32 
    exponent = (n >> 23) - 127 # drop significand, correct exponent offset 
           # 23 and 127 are specific to float32 
    significand = n & np.int32(2**23 - 1) # second factor provides mask 
              # to extract significand 
    return (negative, exponent, significand) 

整数のビットレベルの操作で、このアプローチは、実際のビット列に行くことを実際より便利です自体。

関連する問題