2017-09-07 2 views
1

Ich möchte in der Lage sein, den Signifikanden und den Exponenten der Fließkommazahlen in NumPy zu extrahieren. Den Exponenten als Integer zu erhalten, ist gut und ok für den Signifikanden. Den Signifikanten als Bitfield zu bekommen wäre noch bequemer.Fließkomma-Signifikanz und Exponent in NumPy extrahieren

Ich bin mir bewusst, dass Python Schwimmer eine hex Methode haben; Ich möchte jedoch numpy.float32, Anzahl Arrays und ufuncs verwenden. Ich bin mir auch bewusst von der numpy view Methode, die ich den Schwimmer als Integer sehen kann und somit als Binär-String:

>>> 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' 

die Exponenten Extrahierung und melden Sie sich an diese Art und Weise ist nicht bequem, als führender 0s fallen gelassen von bin. (Ich könnte link-Pad bis 32 Bits mit 0s aber ...)

In jedem Fall, weil bin ist kein ufunc, das ist nicht bequem und ich müsste über das Array iterieren.

Gibt es keinen bequemeren Ansatz, um das zu tun, was ich will?

+1

Werfen Sie einen Blick auf [diese Antwort] (https://Stackoverflow.com/a/16444786/3214872), es könnte Sie in die richtige Richtung zeigen – GPhilo

+1

@GPhilo: Danke. Tatsächlich scheint diese Antwort klarzustellen, dass es keinen bequemeren Ansatz gibt. – equaeghe

+1

Werfen Sie einen Blick auf ['numpy.frexp'] (https://docs.scipy.org/doc/numpy/reference/generated/numpy.frexp.html) –

Antwort

1

GPhilio Kommentar löste eine gründlichere Suche auf SO, die in der folgenden Lösung ergab, bezogen auf 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) 

Dieser Ansatz mit Bit-Level-Operationen von ganzen Zahlen ist eigentlich bequeme, dass das eigentliche bitstring gehen selbst.

Verwandte Themen