如何解决python 2和3之间numpy数组的pickle不兼容?
这似乎是某种不兼容。它试图加载一个“binstring”对象,该对象被假定为 ASCII,而在这种情况下它是二进制数据。如果这是 python 3
unpickler 中的错误,或者是 numpy 对pickler 的“滥用”,我不知道。
这是一种解决方法,但我不知道此时数据有多大意义:
import pickle
import gzip
import numpy
with open('mnist.pkl', 'rb') as f:
u = pickle._Unpickler(f)
u.encoding = 'latin1'
p = u.load()
print(p)
在 python 2 中将其取消腌制然后重新腌制只会再次产生相同的问题,因此您需要将其保存为另一种格式。
解决方法
我正在尝试使用此程序在 python 3.2 中加载此处链接的 MNIST
数据集:
import pickle
import gzip
import numpy
with gzip.open('mnist.pkl.gz','rb') as f:
l = list(pickle.load(f))
print(l)
不幸的是,它给了我错误:
Traceback (most recent call last):
File "mnist.py",line 7,in <module>
train_set,valid_set,test_set = pickle.load(f)
UnicodeDecodeError: 'ascii' codec can't decode byte 0x90 in position 614: ordinal not in range(128)
然后我尝试在 python 2.7 中解码腌制文件,并重新编码。所以,我在 python 2.7 中运行了这个程序:
import pickle
import gzip
import numpy
with gzip.open('mnist.pkl.gz','rb') as f:
train_set,test_set = pickle.load(f)
# Printing out the three objects reveals that they are
# all pairs containing numpy arrays.
with gzip.open('mnistx.pkl.gz','wb') as g:
pickle.dump(
(train_set,test_set),g,protocol=2) # I also tried protocol 0.
它运行没有错误,所以我在 python 3.2 中重新运行了这个程序:
import pickle
import gzip
import numpy
# note the filename change
with gzip.open('mnistx.pkl.gz','rb') as f:
l = list(pickle.load(f))
print(l)
但是,它给了我和以前一样的错误。我怎样才能让它工作?
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。