在Python 3中加载Python 2 .npy文件时出错

时间:2017-06-16 14:34:20

标签: python numpy

我有使用Python 2.7.9和Numpy Version 1.11.3使用命令np.save('filename')创建的.npy文件。这些文件是在我们研究所的linux-cluster的一部分外部机器上生成的。我将文件复制到本地计算机,以便通过np.load('filename.npy')导入它们。在我的本地机器上,我使用Jupyter-Notebook运行Python 3.5.2和Numpy Version 1.13.0。本地操作系统是Ubuntu 16.04.2。

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

ValueError: invalid literal for int() with base 16

在浏览了一些Stackoverflow问题之后,我尝试使用以下命令指定编码:

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

这会产生同样的错误。 encoding='bytes'收益:

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

以下是Traceback的一个更大的片段:

/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版本之间的转换中出现了编码错误。关于如何导入文件的任何想法?

1 个答案:

答案 0 :(得分:2)

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的转换器,就可以使用这些Python 2。 Python 3中的npy文件。

正如我前面提到的,这有点X/Y Problem。您不应该依赖.npy文件来跨版本工作,因为它们不能保证它们本身就是一种易失性格式(如Python VM字节码)。

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