为什么我们在这里需要字节序?

时间:2015-11-13 12:01:05

标签: python numpy endianness

我正在阅读source-code,它会下载zip文件并将数据读入numpy数组。代码假设适用于macos和linux,这里是我看到的片段:

def _read32(bytestream):
    dt = numpy.dtype(numpy.uint32).newbyteorder('>')
    return numpy.frombuffer(bytestream.read(4), dtype=dt)

此功能用于以下环境:

with gzip.open(filename) as bytestream:
    magic = _read32(bytestream)

不难看出这里发生了什么,但我对newbyteorder('>')的目的感到困惑。我读了documentation,知道端点是什么意思,但无法理解为什么开发人员添加了newbyteorder(在我看来并不是真的需要)。

2 个答案:

答案 0 :(得分:7)

这是因为下载的数据采用大端格式,如源页面中所述:http://yann.lecun.com/exdb/mnist/

  

文件中的所有整数首先存储在MSB中(高   大多数非英特尔处理器使用的格式。英特尔的用户   处理器和其他低端机器必须翻转的字节   报头中。

答案 1 :(得分:3)

这只是一种确保以正确的顺序从结果数组中解释字节的方法,而不管系统的本机字节顺序如何。

默认情况下,内置的NumPy整数dtypes将使用系统本机的字节顺序。例如,我的系统是little-endian,所以简单地使用dtype numpy.dtype(numpy.uint32)将意味着从具有big-endian顺序的字节的缓冲区读入数组的值将无法正确解释。

如果np.frombuffer是为了接收已知在特定字节顺序中的字节,最佳做法是使用newbyteorder修改dtype。这在documents for np.frombuffer

中提到
  

注释

     

如果缓冲区的数据不是机器字节顺序,则应将其指定为数据类型的一部分,例如:

>>> dt = np.dtype(int)
>>> dt = dt.newbyteorder('>')
>>> np.frombuffer(buf, dtype=dt)
     

结果数组的数据不会被字节删除,但会是   正确解释。