我有一个32位整数的numpy数组,我想将其转换为16位整数。
我可以使用astype轻松做到这一点但是看起来这总是选择LSBytes而我对MSB感兴趣
interrupts
我可以通过先做正确的转变来得到我想要的东西:
RTOS
但这看起来效率很低。
我已阅读有关astype的文档并尝试了所有的投射选项,但我找不到任何内容。
答案 0 :(得分:4)
您可以创建32位数组的16位“视图”,然后使用切片查看更高阶的单词。
例如,在a
中,低16位包含10,11,12,13,14,15,16,17,高16位包含0,1,2,3,4, 5,6,7:
In [47]: a = np.arange(0, 8, dtype=np.int32)*2**16 + np.arange(10, 18, dtype=np.int32)
In [48]: a
Out[48]: array([ 10, 65547, 131084, 196621, 262158, 327695, 393232, 458769], dtype=int32)
b
是一个由16个值组成的数组,其中包含a
的高16位。 (这假定字节顺序为little-endian。)
In [49]: b = a.view(np.uint16)[1::2]
In [50]: b
Out[50]: array([0, 1, 2, 3, 4, 5, 6, 7], dtype=uint16)
由于.view()
方法和切片不复制数组的数据,b
是与a
相同的内存缓冲区视图。如果您就地更改b
,则还会更改a
。
请注意,这不会对数字进行舍入。 32位数字65535的高16位将为0。
此外,这可能无法按照您想要的方式处理负值。