2016-05-13 2 views
0

Bietet die Python-Standardbibliothek oder scipy/numpy/pandas usw. Unterstützung für das Lesen und Schreiben von hexadezimalen Darstellungen von Gleitkommazahlen (auch "Hexfloats" genannt) in und aus begrenzten Dateien (z. B. TSV oder CSV)?Unterstützung für das Lesen/Schreiben von Hexfloats aus/in Dateien mit Begrenzern?

Als Test erstellte ich eine CSV-Datei, in der die Spalten zwischen dezimalen und hexadezimalen Gleitkommazahlen wechselten, und versuchte, diese Datei mit pandas.read_csv zu lesen. In dem resultierenden Datenframe wurden die Spalten, die Dezimal-Floats enthielten, korrekt in Python-Floats konvertiert, wohingegen diejenigen, die hexadezimale Floats enthielten, als Strings belassen wurden.


EDIT: Klarstellung: Ich brauche keine Hilfe beim Konvertieren von Hexfloats in Floats und umgekehrt. Dafür gibt es float.fromhex und float.hex. Was ich suche, ist für einen Dateireader, der sinnvolle Heuristiken anwendet, um Hexfloats automatisch in Floats umzuwandeln (genau wie pandas.read_csv weiß, dass Dezimaldarstellungen von Zahlen in numerische Python-Objekte konvertiert werden).

+0

Was wäre der Begrenzer in einer solchen Datei? – hpaulj

+0

@hpaulj: Was auch immer die Daten nicht beeinträchtigt: Komma, Tab, [US] (https://en.wikipedia.org/wiki/C0_and_C1_control_codes#Field_separators), etc. – kjo

+0

Gibt es ein '%' Format, das funktionieren würde ? z.B. '% ???'% 12.23'? – hpaulj

Antwort

1
from binascii import unhexlify 
from struct import unpack 
hex_string="abcd33ef" 
my_bytes = unhexlify(hex_string) 
my_float = unpack("f",my_bytes) 

Ich denke ... vielleicht?

+0

Sorry, meine Frage war nicht klar. Ich habe es bearbeitet. – kjo

3

Ich kann nichts in den % Formatierungsspezifikationen finden, die eine hex für einen Floss erstellen (nur %x für Ints). So akzeptieren Ihre float.hex, kann ich eine Funktion erstellen, die jeden Schwimmer in einem Array in einen Hex-String konvertiert:

def foo(x): 
    return x.hex() 
vfoo=np.vectorize(foo) # just for ease of applying foo to an array 

In [478]: x=np.arange(12.).reshape(3,4)/3 

In [479]: x 
Out[479]: 
array([[ 0.  , 0.33333333, 0.66666667, 1.  ], 
     [ 1.33333333, 1.66666667, 2.  , 2.33333333], 
     [ 2.66666667, 3.  , 3.33333333, 3.66666667]]) 

In [480]: vfoo(x) 
Out[480]: 
array([['0x0.0p+0', '0x1.5555555555555p-2', '0x1.5555555555555p-1', 
     '0x1.0000000000000p+0'], 
     ['0x1.5555555555555p+0', '0x1.aaaaaaaaaaaabp+0', 
     '0x1.0000000000000p+1', '0x1.2aaaaaaaaaaabp+1'], 
     ['0x1.5555555555555p+1', '0x1.8000000000000p+1', 
     '0x1.aaaaaaaaaaaabp+1', '0x1.d555555555555p+1']], 
     dtype='<U20') 

dann kann ich die üblichen savetxt verwenden, um diese Zeichenfolgen in einer Datei

In [481]: np.savetxt('test.txt',vfoo(x), fmt='%25s',delimiter=',') 

zu schreiben Welche wie folgt aussieht:

In [482]: cat test.txt 
       0x0.0p+0,  0x1.5555555555555p-2,  0x1.5555555555555p-1,  0x1.0000000000000p+0 
    0x1.5555555555555p+0,  0x1.aaaaaaaaaaaabp+0,  0x1.0000000000000p+1,  0x1.2aaaaaaaaaaabp+1 
    0x1.5555555555555p+1,  0x1.8000000000000p+1,  0x1.aaaaaaaaaaaabp+1,  0x1.d555555555555p+1 

und loadtxt diese

verarbeiten kann
In [486]: np.loadtxt('test.txt',delimiter=',') 
Out[486]: 
array([[ 0.  , 0.33333333, 0.66666667, 1.  ], 
     [ 1.33333333, 1.66666667, 2.  , 2.33333333], 
     [ 2.66666667, 3.  , 3.33333333, 3.66666667]]) 

loadtxt verwendet dieses Stück Code, wenn es 0x Spalten

/usr/lib/python3/dist-packages/numpy/lib/npyio.py in floatconv(x) 
    656   x.lower() 
    657   if b'0x' in x: 
--> 658    return float.fromhex(asstr(x)) 

Sie sieht vielleicht andere Ideen erhalten, indem die npyio.py Datei zu studieren.

Verwandte Themen