Python gzip 模块在 ubyte 文件上无法按预期工作



我期望以下代码

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不同意文件对象语义。这是一个已知的问题,Numpy的某些部分(例如np.load())可容纳,但fromfile()不适合。

要解决它(仅在gzip情况下需要,但在两者中都起作用):

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

相关内容

  • 没有找到相关文章

最新更新