我期待以下代码

import gzip
import numpy as np

def read_ubyte(self, fname):
    with gzip.open(fname, 'rb') as flbl:
        magic, num = struct.unpack(">II", flbl.read(8))
        lbl = np.fromfile(flbl, dtype=np.int8)
    return magic, num, lbl

if __name__ == "__main__":
    print(read_ubyte("train-labels-idx1-ubyte.gz"))


与首先执行gunzip train-labels-idx1-ubyte.gz然后执行完全相同

import numpy as np

def read_ubyte(self, fname):
    with open(fname, 'rb') as flbl:
        magic, num = struct.unpack(">II", flbl.read(8))
        lbl = np.fromfile(flbl, dtype=np.int8)
    return magic, num, lbl

if __name__ == "__main__":
    print(read_ubyte("train-labels-idx1-ubyte"))


但是没有,第一个代码给出了输出:

(2049, 60000, array([  0,   3, 116, ..., -22,   0,   0], dtype=int8))


第二个

(2049, 60000, array([5, 0, 4, ..., 5, 6, 8], dtype=int8))


为什么?

注1:第二个是正确的输出(不使用gzip模块)

注意2:数字2049和60000是正确的

注意3:如果要复制,可以从http://yann.lecun.com/exdb/mnist/下载文件

最佳答案

NumPy和GZip在文件对象语义上存在分歧。这是一个known issue,NumPy的某些部分(例如np.load())可以容纳,但fromfile()不能容纳。

要变通解决(仅在gzip情况下需要,但在两种情况下都可以):

    lbl = np.fromstring(flbl.read(), dtype=np.int8)

关于python - Python gzip模块无法在ubyte文件上正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47574607/

10-13 08:37
查看更多