我正在阅读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(在我看来并不是真的需要)。
答案 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)
结果数组的数据不会被字节删除,但会是 正确解释。