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

时间:2011-08-12 00:17:14

标签: python integer floating-point

我正在尝试将用不同语言编写的代码的一部分(一种名为Igor Pro的Wavemetrics,用于那些你已经听说过它的代码)移植到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 个答案:

答案 0 :(得分:5)

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位值。

答案 1 :(得分: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. 的数组副本
  3. .view返回数组视图(具有相同的基础数据), 根据新的dtype解释数据。

答案 2 :(得分: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位输入进行字节交换,但您可以自行检查。