使用numpy视图将int32转换为int8

时间:2017-09-21 19:48:27

标签: python numpy

我试图将numpy int32数组视为int8类型。

>>> a = np.array([1, 2, 3, 4], dtype='int32')
>>> a
array([1, 2, 3, 4], dtype=int32)
>>> a.view('int8')
array([1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0], dtype=int8)

我希望将1转换为[0,0,0,1],但为什么它会变成[1,0,0,0]?这与数字如何存储在内存中有关吗?

感谢。

2 个答案:

答案 0 :(得分:3)

  

这与数字在内存中的存储方式有关吗?

是的,有big endian and low endian。引用维基百科:

  

字节顺序是指当存储在计算机存储器或二级存储器中或通过数字链路传输时,字节排列成较大数值的顺序。字节序在计算机科学中很有用,因为两种冲突和不兼容的格式是常用的:字可以用big-endian或little-endian格式表示,这取决于位或字节或其他组件是从大端排序的(最重要的)位)或小端(最低位)。

但是,您可以使用< and > in the dtype

来决定您想要哪一个
>>> import numpy as np
>>> a = np.array([1, 2, 3, 4], dtype='>i4')
>>> a.view('int8')
array([0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4], dtype=int8)

>>> a = np.array([1, 2, 3, 4], dtype='<i4')
>>> a.view('int8')
array([1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0], dtype=int8)

如果没有<>,它将使用系统字节序。使用不同的可能导致(轻微)性能下降。

答案 1 :(得分:1)

完全;假设一个低端字节排序,每个32个数字的最低有效字节将首先出现,最重要的字节将是最后一个。因此,DEADBEEF(十六进制)将变为EF BE AD DE