当前位置: 首页 > 面试题库 >

Python 2和3之间的numpy数组的Pickle不兼容

岳嘉石
2023-03-14
问题内容

我正在尝试使用此程序加载在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, valid_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, valid_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)

但是,它给了我与以前相同的错误。我该如何工作?

这是加载MNIST数据集的更好方法。


问题答案:

这似乎有点不兼容。它试图加载一个“ binstring”对象,该对象假定为ASCII,而在这种情况下,它是二进制数据。如果这是Python
3取消选取器中的错误,还是numpy对选取器的“滥用”,我不知道。

这是一种解决方法,但目前我不知道数据的意义:

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中取消选择它,然后重新选择它只会再次造成相同的问题,因此您需要将其另存为另一种格式。



 类似资料:
  • 我们有一个运行在java 7上的服务器端进程:java-version:java version“1.7.0”java(TM)SE运行时环境(build 1.7.0-b147)java HotSpot(TM)64位服务器VM(build 21.0-b17,混合模式) 它接受来自我们自己开发的java应用程序(通过正确签名的JNLP启动)的SSL连接。 通常情况下,不管客户机应用程序是运行在Java

  • 推荐:Python 2.7.x 与 Python 3.x 的主要差异

  • 问题内容: 我有以下代码。它在Python中永远存在。必须有一种方法可以将此计算结果转换为广播… 问题答案: 您可以在计算出的差异后使用,如下所示: 或使用其可选的metric参数集,以根据问题的需要给我们平方的欧几里得距离,如下所示-

  • 问题内容: SciPy似乎在其自己的名称空间中提供了NumPy的大多数(但不是全部[1])功能。换句话说,如果有一个名为的函数,几乎可以肯定有一个。在大多数情况下,两者看起来是完全相同的,甚至有时指向相同的功能对象。 有时,它们是不同的。举一个最近出现的例子: 是一个ufunc该返回的NaN为负参数; 返回负参数的复杂值,并且似乎不是ufunc。 同样可以说,大约,和,但不是关于[2]。 另一方面

  • 问题内容: 我使用pickle在python 3上转储文件,并使用pickle在python 2上加载文件,出现ValueError。 那么,python 2 pickle无法加载python 3 pickle丢弃的文件吗? 如果我想要吗?怎么做? 问题答案: 您应该在Python 3中使用较低的协议编号来编写腌制的数据。Python3引入了一个带有该编号的新协议(并将其用作默认协议),因此切换回

  • 问题内容: 我对计算两个numpy数组(x和y)之间的各种空间距离感兴趣。 http://docs.scipy.org/doc/scipy-0.14.0/reference/generation/scipy.spatial.distance.cdist.html 但是,以上结果会产生太多不必要的结果。我如何仅将其限制为所需的结果。 我想计算[1,11]和[31,41]之间的距离;[2,22]和[3