2017-06-16 237 views
1

我使用Python 2.7.9和Numpy版本1.11.3创建的.npy文件与命令np.save('filename')。这些文件是在我们研究所的Linux集群的一部分外部机器上生成的。我将这些文件复制到本地机器,以便通过np.load('filename.npy')导入它们。在我的本地机器上,我使用Jupyter-Notebook运行Python 3.5.2和Numpy Version 1.13.0。本地操作系统是Ubuntu 16.04.2。在Python 3中加载Python 2 .npy文件时出错

当我尝试在本地加载文件,我得到的错误:

ValueError: invalid literal for int() with base 16 

通过一些#1提问浏览后,我试图指定与编码:

np.load('filename.npy',encoding='latin1') 

这给了同样的错误。 encoding='bytes'产量:

TypeError: can't multiply sequence by non-int of type 'float' 

这里是回溯较大片段:

/usr/local/lib/python3.5/dist-packages/numpy/lib/npyio.py in load(file, mmap_mode, allow_pickle, fix_imports, encoding) 
417    else: 
418     return format.read_array(fid, allow_pickle=allow_pickle, 
--> 419           pickle_kwargs=pickle_kwargs) 
420   else: 
421    # Try a pickle 

/usr/local/lib/python3.5/dist-packages/numpy/lib/format.py in read_array(fp, allow_pickle, pickle_kwargs) 
638    pickle_kwargs = {} 
639   try: 
--> 640    array = pickle.load(fp, **pickle_kwargs) 
641   except UnicodeError as err: 
642    if sys.version_info[0] >= 3: 

/usr/local/lib/python3.5/dist-packages/sympy/core/numbers.py in __new__(cls, num, prec) 
823     else: 
824      _mpf_ = mpmath.mpf(
--> 825       S.NegativeOne**num[0]*num[1]*2**num[2])._mpf_ 
826   elif isinstance(num, Float): 
827    _mpf_ = num._mpf_ 

TypeError: can't multiply sequence by non-int of type 'float' 

我想的东西与编码出错的Python和NumPy的版本之间的过渡。关于如何导入文件的任何想法?

+0

你不能在Python 3中加载Python 2 Numpy字节码,反之亦然,它只是没有任何意义去尝试。你有没有尝试加载python 2中的.npy文件?因为你已经安装了python 2,如果你使用的是ubuntu – cat

+0

这通常是不可能的吗?我想我之前在Python 3中导入了Python 2 .npy文件,并且一切都很顺利。我无法确定它为什么没有导致错误之前...在Python 2加载文件的作品。 (我在笔记本单元的开头插入'%% python2'来这样做)。但是使用Python 2会导致更多的错误,以至于我一直在寻找解决方案来坚持使用Python 3来使用这些文件。 –

+1

你知道这个文件里面有什么?只是一个数组数组?或某种“对象”。错误在'pickle_load'中,暗示后面。酸洗对象时,'np.save'文档在PY2/3兼容性方面有一些注意事项。 – hpaulj

回答

1

What is the way data is stored in *.npy?所示,.npy文件字节码,这如果在十六进制编辑器打开一个,你会看到。

Python 2字节码.pyc,.pyo文件无法在Python 3中运行,因为虚拟机和编译器内部版本随主版本而改变。

类似地,NumPy的C内部结构和字节码编译器在Python 3中也发生了变化,从而打破了向后兼容性。 (这是有意的,因为字节码并不意味着持续这么长时间,或者使用的版本不同于创建的版本。)

这些更改的组合意味着如果不对Python 3的字节码进行大的更改解释器和Python 3的NumPy的,和/或在Python 2 NumPy的字节码到了Python 3,一transpiler正如我先前提到的使用这些Python的2 .npy文件在Python 3


,这是一个位X/Y Problem。您不应该依赖于.npy文件跨版本工作,因为它们不能保证它们会固有地为易失性格式(如Python VM字节码)。

而不是反向工程字节码来调试它,尝试获取这些文件生成的来源。

+1

但'.npy'文件不保存Python字节码或任何编译代码。它正在保存数据 - 数组属性加上数组数据缓冲区。在Py2和Py3之间酸洗时存在不兼容性,但数值数组不应该不同。 – hpaulj