2015-11-13 70 views
10

我正在閱讀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,並知道什麼endianness的意思,但不明白爲什麼開發人員加入newbyteorder(在我看來它不是真的需要)。

回答

7

那是因爲下載的數據是大端格式源頁面描述:http://yann.lecun.com/exdb/mnist/

所有這些文件中的整數存儲在MSB第一(高 端)格式使用的大多數非Intel處理器。英特爾 處理器和其他低端機器的用戶必須翻轉 標頭的字節。

+0

如果你看看第45行的代碼,你會看到'data = numpy.frombuffer(buf,dtype = numpy.uint8)'。這會讓事情變得有點混亂。爲什麼在這行代碼中沒有指定字節序? – emanuele

+1

因爲數據類型'uint8'只有1個字節長。字節序僅對多字節數據類型有意義。 – HeyYO

+0

thanx :)你說得對 – emanuele

3

這只是一種確保按照正確順序從結果數組中解釋字節的方法,而不管系統的本地字節順序如何。

默認情況下,內置的NumPy integer dtypes將使用系統本機的字節序。例如,我的系統是小端的,所以簡單地使用dtype numpy.dtype(numpy.uint32)將意味着從緩衝區讀入數組的數據值將不會被正確解釋。

如果np.frombuffer是爲了接收已知爲特定字節順序的字節,最好的做法是使用newbyteorder來修改dtype。這在documents for np.frombuffer提到:

如果緩衝器有數據,是不是在機器字節順序,這應該被指定爲數據型的一部分,例如:

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

結果數組的數據不會被字節切換,但會被正確解釋爲 。

相關問題