2016-11-07 91 views
0

我正在玩MNIST数据集,遇到以下情况,我不太明白。根据 documentation数据的格式如下:用python读取MNIST字节

[offset] [type]   [value]   [description] 
0000  32 bit integer 0x00000801(2049) magic number (MSB first) 
0004  32 bit integer 60000   number of items 
0008  unsigned byte ??    label 
0009  unsigned byte ??    label 
........ 
xxxx  unsigned byte ??    label 
The labels values are 0 to 9. 

因此,我期望的字节4-8,对应于物品(60,000)的数量为:

struct.pack('i', 60000) 
>> '`\xea\x00\x00' 

然而,当我读文件逐字节,它看起来像它们以相反的顺序:

with gzip.open(path_to_file, 'rb') as f: 
    print struct.unpack('cccc', f.read(4)) 
    for i in range(4): 
     print struct.unpack('c', f.read(1)) 
>> ('\x00', '\x00', '\x08', '\x01') 
>> ('\x00', '\x00', '\xea', '`') 

很显然,我可以扭转他们得到预期的顺序,但我confu sed为什么字节似乎颠倒了。

回答

1

这是一个单词内字节排序的工件。数据被格式化为一个整数,所以你的假设这样读取它。这是“小端”寻址,最低(最早)地址的最低有效字节。请注意,在第一个字段中,指定的格式为“MSB优先”。