Python gzip 模块在 ubyte 文件上没有按预期工作
Python gzip module doesn't work as expected on ubyte file
我期待以下代码
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)
我期待以下代码
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)