2016-05-13 88 views
0

Python標準庫或scipy/numpy/pandas等是否支持讀寫浮點數字(又名「hexfloats」)的十六進制表示以及來自分隔文件(例如TSV或CSV)?是否支持從/分隔文件讀取/寫入hexfloats?

作爲一個測試,我做了一個CSV文件,其中的列在十進制和十六進制浮點數之間交替,並嘗試使用pandas.read_csv讀取此文件。在生成的數據框中,包含十進制浮點數的列被正確地轉換爲Python浮點數,而包含十六進制浮點數的列被保留爲字符串。


編輯:澄清:我不需要幫助將hexfloats轉換成浮動,反之亦然。那裏有float.fromhexfloat.hex。我正在尋找的是一個文件閱讀器,將採用合理的啓發式自動將hexfloats轉換爲浮點數(就像pandas.read_csv知道將十進制數字表示形式轉換爲數字Python對象一樣)。

+0

這樣的文件中的分隔符是什麼? – hpaulj

+0

@hpaulj:任何不會干擾數據:逗號,標籤,[美國](https://en.wikipedia.org/wiki/C0_and_C1_control_codes#Field_separators)等 – kjo

+0

是否有'%'格式可以工作?例如'%???'%12.23'? – hpaulj

回答

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

我猜...也許?

+0

對不起,我的問題不清楚。我編輯過它。 – kjo

3

我找不到%格式化規格中的任何內容,這些規格會爲浮點數創建一個hex(對於整數,只需%x)。所以,接受你的float.hex,我可以創建數組中的每一個浮動轉換爲十六進制字符串的函數:

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

然後我可以使用通常savetxt那些字符串寫入文件

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

它看起來像:

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 

loadtxt可以處理這個

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使用這段代碼時,看到0x

/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)) 

你可能會通過研究npyio.py文件得到其他的想法。