使用Python 3.5加载.npz总是会崩溃

时间:2019-05-23 05:48:56

标签: python-3.x python-2.7 numpy

在用Python 2.7编写的这个简单的tutorial中,他们一行加载了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 个答案:

答案 0 :(得分:1)

您首先说事情崩溃了,现在您说当尝试访问特定阵列时它死机了。 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工作的同一台计算机上加载此文件的吗?还是文件已从另一台计算机传输,并且可能已损坏?

这些参数表明,Py2和Py3之间的pickle代码有所不同。如果原始保存包含对象dtype数组或非数组对象,则它们将为pickled,并且在pickle版本中可能不兼容。

答案 1 :(得分:0)

尝试一下

with np.load('../musicnet.npz') as train_data:
    X,Y = train_data['2494']

答案 2 :(得分:0)

我认为有2种出路:

  1. 重新编辑您的代码

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

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

因为python2.7 / 3.5中r/rb的模式与您的情况有所不同。

  1. 使用默认调试器指向重大错误。 (通常,以我的经验为基础)