我有 .npy 文件,这些文件是使用 Python 2.7.9 和 Numpy 版本 1.11.3 通过命令 np.save('filename')
创建的。这些文件是在外部机器上生成的,该机器是我们研究所 Linux 集群的一部分。我将文件复制到本地计算机,以便通过 np.load('filename.npy') 导入它们。在我的本地计算机上,我正在使用 Jupyter-Notebook 运行 Python 3.5.2 和 Numpy 版本 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'
这是回溯的较大片段:
/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 版本之间的转换时编码出了问题。关于如何导入文件有什么想法吗?
最佳答案
如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
文件来跨版本工作,因为不能保证它们会这样做,因为它们本质上是一种 volatile 格式(如 Python VM 字节码)。
不要对字节码进行逆向工程来调试它,而是尝试获取生成这些文件的源。
关于python - 在 Python 3 中加载 Python 2 .npy 文件时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44591904/