Сочетание несовместимости массивов numpy между Python 2 и 3

Я пытаюсь загрузить набор данных MNIST, связанный здесь, в Python 3.2, с помощью этой программы:

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.

4 Solutions collect form web for “Сочетание несовместимости массивов numpy между Python 2 и 3”

Это похоже на несовместимость. Он пытается загрузить объект «binstring», который предполагается ASCII, тогда как в этом случае это двоичные данные. Если это ошибка в неуправляемом Python 3 или «неправильном использовании» pickler 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, а затем перекрашивая, он снова создаст ту же проблему, поэтому вам нужно сохранить ее в другом формате.

Если вы получаете эту ошибку в python3, то это может быть проблема несовместимости между python 2 и python 3, для меня решение было load с lattin1 кодировки lattin1 :

 pickle.load(file, encoding='latin1') 

Похоже, что есть некоторые проблемы с compatablility в мариновании между 2.x и 3.x из-за перехода на unicode. Ваш файл, кажется, маринован с python 2.x и декодирует его в 3.x может быть неприятным.

Я бы предложил раскрыть его с помощью python 2.x и сохранить в формате, который будет играть более красиво в двух версиях, которые вы используете.

Это проблема несовместимости между Python 2 и Python 3. Я попытался загрузить набор данных MNIST с помощью

  train_set, valid_set, test_set = pickle.load(file, encoding='iso-8859-1') 

и он работал на Python 3.5.2

Interesting Posts

Интересно 'принимает ровно 1 аргумент (2 заданный)' Ошибка Python

Окно терминала Python появляется при запуске приложения pygame

Как построить температуру (напряжения) на прямоугольной полосе матплотлибом?

Как построить многоцветную кривую с использованием одной команды plot в matplotlib

Есть ли эквивалент Python функции conv2 MATLAB?

Как указать версию python, используемую для создания виртуальной среды?

Как перенаправить людей после регистрации с помощью регистрации django

Модуль zipfile python, похоже, не сжимает мои файлы

Как установить / найти аргумент ca_certs в python ssl.wrap_socket ()

Большая цветовая палитра в matplotlib для дендрограммы SciPy (Python)

Как использовать SQLAlchemy отражение с Sybase?

В TensorFlow есть ли способ просто инициализировать неинициализированные переменные?

Как рисовать плоскости из набора линейных уравнений в Python?

Python: создание нового списка из существующего путем удаления каждого n-го элемента

Python не может получить полное имя файла

Python - лучший язык программирования в мире.