【发布时间】:2017-06-16 23:20:08
【问题描述】:
我有使用 Python 2.7.9 和 Numpy 版本 1.11.3 使用命令 np.save('filename') 创建的 .npy 文件。这些文件是在我们研究所 linux-cluster 的一部分的外部机器上生成的。我将文件复制到本地计算机,以便通过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'
这是 Traceback 的更大的 sn-p:
/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 版本之间的转换中编码出现了问题。关于如何导入文件的任何想法?
【问题讨论】:
-
你不能在 Python 3 中加载 Python 2 Numpy 字节码,反之亦然,尝试没有任何意义。您是否尝试过在 python 2 中加载 .npy 文件?因为如果你使用的是 ubuntu,你已经安装了 python 2
-
一般情况下不可能吗?我想我之前确实在 Python 3 中导入了 Python 2 .npy 文件,一切都很顺利。我无法确定为什么它之前没有导致错误……在 Python 2 中加载文件是可行的。 (我在笔记本单元格的开头插入
%%python2这样做)。但是使用 Python 2 会导致更多错误,因此我一直在寻找一种解决方案来坚持使用 Python 3 来使用这些文件。 -
你知道这个文件里有什么吗?只是一个数字数组?或某种
object。错误在pickle_load,提示后者。np.savedocs 对酸洗对象时的 PY2/3 兼容性有一些注意事项。 -
这是一个重要的提示,谢谢!这些文件基本上只是二维数值数组。但是,存储到这些数组中的数值属于
sympy.core.numbers.Float类型。使用 NumPy 保存和加载会生成一个带有dtype=object的数组。我想我的问题的正确解决方法是在将 SymPy-Number 写入列表之前将其转换为 Python-Float。 @cat 也感谢您的解释!