Загрузка .npz с Python 3.5 всегда дает сбой - PullRequest
0 голосов
/ 23 мая 2019

В этом простом учебнике , написанном на Python 2.7, у них есть строка, загружающая массив numpy.

train_data = np.load(open('../musicnet.npz','rb'))

Затем они получают данные, вызывая разные ключи

X,Y = train_data['2494']

Все хорошо работает в python 2.7

Тип данных train_data равен numpy.lib.npyio.NpzFile

Моя проблема

Однако всякий раз, когда я пытаюсь сделать то же самоев Python 3.5 большинство строк работают нормально, за исключением того, что когда речь идет о строке X,Y = train_data['2494'], она просто зависает там навсегда.Я хотел бы использовать Python 3.5, потому что другие мои проекты написаны на python 3.5.

Как переписать эту строку, чтобы она работала с Python 3.5?

Сообщение об ошибке

Наконец-то мне удалось получить сообщение об ошибке в терминале enter image description here

Там он зависает, потому что сразу после сообщения об ошибке выводится тонна, моя записная книжка Jupyter просто не может обработать столько информации.enter image description here

Решение

Измените кодировку на «байты»

train_data = np.load('../musicnet.npz', encoding='bytes')

Тогда все работает нормально.

Ответы [ 3 ]

1 голос
/ 23 мая 2019

Сначала вы сказали, что что-то не работает, теперь вы говорите, что оно зависает при попытке доступа к определенному массиву. numpy имеет такой же синтаксис в 3,5 по сравнению с 2,7. Вам не нужно ничего переписывать.

np.load имеет пару параметров, которые имеют дело с различиями между Py2 и Py3. Но я не уверен, что это проблема для вас.

fix_imports : bool, optional
    Only useful when loading Python 2 generated pickled files on Python 3,
    which includes npy/npz files containing object arrays. If `fix_imports`
    is True, pickle will try to map the old Python 2 names to the new names
    used in Python 3.
encoding : str, optional
    What encoding to use when reading Python 2 strings. Only useful when
    loading Python 2 generated pickled files in Python 3, which includes
    npy/npz files containing object arrays. Values other than 'latin1',
    'ASCII', and 'bytes' are not allowed, as they can corrupt numerical
    data. Default: 'ASCII'

Попробуйте

print(list(train_data.keys()))

Здесь должны отображаться имена массивов, которые были сохранены в архиве zip. Они совпадают с именами в загрузке Py2? Они включают название «2494»?

Несколько вещей необычны в отношении:

X,Y = train_data['2494']

Именование массива в zip-архиве по номеру строки и распаковка загрузки в две переменные.

Вы знаете что-нибудь о том, как это было savez? Что было сохранено?

Другой вопрос - вы загружаете этот файл с той же машины, на которой работал Py2? Или файл был перенесен с другого компьютера и, возможно, поврежден?

Как показывают эти параметры, в коде pickle имеются различия между Py2 и Py3. Если исходное сохранение включало в себя массивы dtype объектов или объекты, не являющиеся массивами, то они будут pickled, и в версиях маринадов могут быть несовместимости.

0 голосов
/ 23 мая 2019

На мой взгляд, есть 2 выхода:

  1. заново отредактируйте ваш код

    train_data = np.load(open('../musicnet.npz','rb'))

до

train_data = np.load(open('../musicnet.npz','r'))

Потому что режим r/rb в python2.7 / 3.5 - это различие в вашей ситуации.

Использование отладчика по умолчанию для указания существенной ошибки.(Обычно работаю на своем опыте)
0 голосов
/ 23 мая 2019

Попробуйте это,

with np.load('../musicnet.npz') as train_data:
    X,Y = train_data['2494']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...