在用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上运行?
它冻结在那里,因为在错误消息后立即有大量输出,我的jupyter笔记本无法处理那么多信息。
将编码更改为“字节”
train_data = np.load('../musicnet.npz', encoding='bytes')
然后一切正常。
答案 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种出路:
重新编辑您的代码
train_data = np.load(open('../musicnet.npz','rb'))
到
train_data = np.load(open('../musicnet.npz','r'))
因为python2.7 / 3.5中r/rb
的模式与您的情况有所不同。