我正在尝试将用不同语言编写的代码的一部分(一种名为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?这是否与byteswap
或newbyteorder
或其他内容有关?
答案 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)
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)
.astype
创建一个强制转换为新dtype .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位输入进行字节交换,但您可以自行检查。