我有使用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版本之间的转换中出现了编码错误。关于如何导入文件的任何想法?
答案 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字节码)。
不是对字节码进行逆向工程来调试它,而是尝试获取生成这些文件的源代码。