Python标准库或scipy / numpy / pandas等是否支持从分隔文件(例如TSV)读取和写入浮点数(也称为#34; hexfloats")的十六进制表示形式或CSV)?
作为测试,我创建了一个CSV文件,其中列在十进制和十六进制浮点之间交替,并尝试使用pandas.read_csv
读取此文件。在结果数据框中,包含十进制浮点数的列已正确转换为Python浮点数,而包含十六进制浮点数的列则保留为字符串。
编辑:澄清:我不需要帮助将六叶浮动转换成浮子,反之亦然。那里有float.fromhex
和float.hex
。我正在寻找的是文件阅读器,它将应用合理的启发式方法自动将hexfloats转换为浮点数(就像pandas.read_csv
知道将数字的十进制表示转换为数字Python对象一样。)
答案 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)
我想......也许?