【问题标题】:Converting 16-bit integer to 32-bit floating-point将 16 位整数转换为 32 位浮点数
【发布时间】:2011-10-25 10:51:08
【问题描述】:

我正在尝试将用另一种语言编写的代码的一部分移植到 Python 中。

在此代码中,将数据类型从 16 位整数(从 16 位大端二进制文件中读取)转换为单精度(32 位)浮点。在这个程序中,转换如下:

有符号 16 位整数:

print tmp
tmp[0]={-24160,18597,-24160,18597,-24160}

转换为 32 位浮点数:

Redimension/S/E=1 tmp
print tmp
tmp[0]={339213,339213,5.79801e-41,0,0}

/S 标志/选项表示tmp 的数据类型应该是 float32 而不是 int16。但是,我相信重要的标志/选项是/E=1,据说是“在不转换或移动数据的情况下强制重塑”。

在Python中,转换如下:

>>> tmp[:5]
array([-24160,  18597, -24160,  18597, -24160], dtype=int16)

>>> tmp.astype('float32')
array([-24160.,  18597., -24160., ...,  18597., -24160.,  18597.], dtype=float32)

这是我所期望的,但我需要在上面的原始代码中找到一个模拟 /E=1 选项的函数/操作。有没有一种明显的方法可以将 -24160 和 18597 都转换为 339213?这与byteswapnewbyteorder 或其他有什么关系?

【问题讨论】:

    标签: python integer floating-point


    【解决方案1】:
    import numpy
    tmp=numpy.array([-24160,18597,-24160,18597,-24160, 0], numpy.int16)
    tmp.dtype = numpy.float32
    print tmp
    

    结果:

    [  3.39213000e+05   3.39213000e+05   5.79801253e-41]
    

    我不得不在值列表中添加一个零,因为有奇数个值。它不能将这些解释为 32 位浮点数,因为有 5 个 16 位值。

    【讨论】:

      【解决方案2】:

      有没有一种明显的方法可以将 -24160 和 18597 都转换为 339213?

      没有,但也没有任何明显的方法可以将 -24160 转换为 339213 5.79801e-41 0。

      看起来更像是转换需要 两个 输入数字来创建 一个 输出(可能通过将原始 2×16 位连接到 32 位并将结果称为浮点数)。在这种情况下,-24160,18597 对始终变为 339213,而 5.79801e-41 可能来自-24160,0,其中 0 是由于输入用完而发明的。由于 5.79801e-41 看起来可能是单精度非规范化,这意味着这两个 16 位块可能以小端顺序连接。

      您是否需要对每个 16 位输入进行字节交换仍有待观察,但您可以自己检查。

      【讨论】:

        【解决方案3】:

        使用view 代替astype

        In [9]: tmp=np.array([-24160,  18597, -24160,  18597, -24160, 18597], dtype=int16)
        
        In [10]: tmp.view('float32')
        Out[10]: array([ 339213.,  339213.,  339213.], dtype=float32)
        
        1. .astype 创建转换为新 dtype 的数组的副本
        2. .view 返回数组的视图(具有相同的基础数据), 数据根据新的 dtype 进行解释。

        【讨论】:

        • 谢谢——奇怪的是 astype 的返回值和视图操作打印不同的东西......
        猜你喜欢
        • 1970-01-01
        • 2010-12-12
        • 2017-04-19
        • 1970-01-01
        • 1970-01-01
        • 2019-05-30
        • 2021-03-26
        • 1970-01-01
        相关资源
        最近更新 更多