从python中的数组中获取更高阶的字节

时间:2017-05-23 12:12:09

标签: python arrays numpy casting

我有一个32位整数的numpy数组,我想将其转换为16位整数。

我可以使用astype轻松做到这一点但是看起来这总是选择LSBytes而我对MSB感兴趣

interrupts

我可以通过先做正确的转变来得到我想要的东西:

RTOS

但这看起来效率很低。

我已阅读有关astype的文档并尝试了所有的投射选项,但我找不到任何内容。

1 个答案:

答案 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。

此外,这可能无法按照您想要的方式处理负值。