将16位整数转换为32位浮点数

4

我正在尝试将一部分用另一种语言编写的代码(一个名为Igor Pro的晦涩语言,对于那些听说过它的人来说)移植到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或其他什么有关吗?

3个回答

6
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]

由于值的数量为奇数,我必须在列表中添加一个零。由于存在5个16位值,因此无法将其解释为32位浮点数。


2

使用 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 和 view 操作返回的值打印出来不同,这很奇怪... - hatmatrix

1
有没有明显的方法可以将-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位输入进行字节交换,但您可以自行检查。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接