是否支持从分隔文件读取/写入hexfloats?

时间:2016-05-13 23:30:09

标签: python csv numpy pandas scipy

Python标准库或scipy / numpy / pandas等是否支持从分隔文件(例如TSV)读取和写入浮点数(也称为#34; hexfloats")的十六进制表示形式或CSV)?

作为测试,我创建了一个CSV文件,其中列在十进制和十六进制浮点之间交替,并尝试使用pandas.read_csv读取此文件。在结果数据框中,包含十进制浮点数的列已正确转换为Python浮点数,而包含十六进制浮点数的列则保留为字符串。

编辑:澄清:我不需要帮助将六叶浮动转换成浮子,反之亦然。那里有float.fromhexfloat.hex。我正在寻找的是文件阅读器,它将应用合理的启发式方法自动将hexfloats转换为浮点数(就像pandas.read_csv知道将数字的十进制表示转换为数字Python对象一样。)

2 个答案:

答案 0 :(得分:3)

我无法在%格式规范中找到任何可为浮点数创建hex的内容(仅对{1}}进行注册。所以接受你的%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)) 文件获得其他想法。

答案 1 :(得分:1)

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

我想......也许?