首页 文章

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

提问于
浏览
0

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

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


编辑:澄清:我没有't need help converting hexfloats into floats, and vice-versa. There' s float.fromhexfloat.hex . 我正在寻找的是一个文件阅读器,它将应用合理的启发式方法自动将hexfloats转换为浮点数(就像 pandas.read_csv 知道将数字的十进制表示转换为数字Python对象) .

2 回答

  • 1

    我在 % 格式规范中找不到任何可以为浮点数创建 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 文件获得其他想法 .

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

    我想......也许吧?

相关问题