2016-11-07 89 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優先」。