python3 如何读取python2的npy文件
python3读取python2打包的npy文件会报错,原因是编码方式不同,所以只要在读取的时候加上编码方式即可。
解决方法
docs_train = np.load('./data/20news_clean/train.txt.npy', allow_pickle=true, encoding='bytes') docs_test = np.load('./data/20news_clean/test.txt.npy', allow_pickle=true, encoding='bytes')
路径中的文件是python2打包的。
补充:在python 3中加载python 2 .npy文件时出错
我有.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
浏览了一些*问题后,我尝试使用以下方式指定编码:
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版本之间的转换时,编码有问题。关于如何导入文件的任何想法?
解决方案
如中所示,*。npy中数据的存储方式是什么?,.npy文件为字节码,如果您在十六进制编辑器中打开一个字节码,则会看到该文件。
python 2字节码.pyc,.pyo文件无法在python 3中运行,因为虚拟机和编译器内部版本已随主要版本更改。
同样,numpy的c内部结构和字节码编译器在python 3中也发生了变化,从而破坏了向后兼容性。(这是有意的,因为字节码并不是要持续那么长时间,或者不能与所创建的版本一起使用。)
这些变更的组成意味着,如果不对python 3的字节码解释器和python 3的numpy进行大的更改,和/或从python 2 numpy字节码到python 3的转译器,则无法使用这些python 2 .npy文件。 python 3。
正如我之前提到的,这有点像x / y问题。您不应该依赖.npy文件在各个版本之间工作,因为不能保证它们会保持一致,因为它们本质上是易失性格式(例如python vm字节码)。
与其对字节码进行逆向工程以对其进行调试,不如尝试获取生成这些文件的源。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
上一篇: pgsql 如何删除仍有活动链接的数据库
下一篇: Win10系统桌面壁纸无法设置该如何解决