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

标签 python numpy

我有 .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/

相关文章:

python - 在python中自动给出用户输入是/否

python - Scipy 插值.splprep 错误 "Invalid Inputs"

Python:统计长度为3的姓氏并将其分配给 "answer"变量

python - 索引 numpy 多维数组取决于切片方法

python - 如何使用 numpy 保存和读回多维字符串数组(可能)?

python - 使用 numpy 查找 xy 数据点图的局部最大值?

python - 对一行中的元素求和(Python/Numpy)

python - 为什么 "map"版本的ThreeSum这么慢?

python - 在python中获取一组二维列表

python - 使用 numpy loadtxt 时添加 'b' 字符