2017-06-16 29 views
1

Python 2.7.9とNumpy Version 1.11.3を使用して作成した.npyファイルには、コマンドnp.save('filename')が含まれています。このファイルは、私たちの研究所のlinux-clusterの一部である外部マシン上で生成されました。 np.load('filename.npy')でインポートするためにローカルマシンにファイルをコピーしました。私のローカルマシンでは、Jupyter-NotebookでPython 3.5.2とNumpy Version 1.13.0を実行しています。ローカルOSはUbuntu 16.04.2です。Python 3でPython 2の.npyファイルを読み込む際のエラー

私はローカルファイルをロードしようとすると、私はエラーを取得する:私はエンコーディングを指定しようとしたいくつかのStackOverflowの質問を閲覧した後

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' 

ここでは、トレースバックの大きな抜粋です:

/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

Python 3でPython 2 Numpyバイトコードを読み込むことはできません。その逆もできますが、試しても意味がありません。 Python 2で.npyファイルを読み込もうとしましたか?あなたが既にubuntuを使っているなら、あなたはすでにPython 2をインストールしているからです。 – cat

+0

一般的に不可能ですか?私は前にPython 3でPython 2の.npyファイルをインポートしたと思います。すべてがスムーズに進みました。なぜ私はそれが前にエラーに至らなかったのかを確かに伝えることはできません... Python 2でファイルを読み込みます。 (ノートセルの先頭に '%% python2'を挿入します)。しかし、Python 2を使用すると、これらのファイルを使用するためにPython 3を使用するソリューションを探しているようなエラーが発生します。 –

+1

あなたはこのファイルの内容を知っていますか?数値配列ですか?あるいは、ある種の 'オブジェクト '。エラーは 'pickle_load'にあり、後で示唆しています。 'np.save' docsには、オブジェクトを酸洗いするときのPY2/3の互換性に関するいくつかの注意があります。 – hpaulj

答えて

1

What is the way data is stored in *.npy?に示すように、.npyファイルは、バイナリエディタで1を開いたときに表示されますバイトコード、です。

Python 2バイトコード.pyc,仮想マシンとコンパイラの内部構造がメジャーバージョンで変更されているため、ファイルをPython 3で実行することはできません。

同様に、NumPyのC内部関数とバイトコードコンパイラも、Python 3では後方互換性を改変して変更されています。 (バイトコードは長い間持続するものではなく、作成されたバージョンとは異なるバージョンで使用されることを意図していないため意図的です。)

これらの変更の構成は、Python 3のバイトコードを大きく変更することなく、インタープリタとPython 3のnumpyの、および/またはPythonの3のようにPythonの2 numpyのバイトコードからtranspiler私は以前に示唆したようにPythonの3


にこれらのPython 2 .npyファイルを使用するように、これは、 X/Y Problemのビット。バージョン間で動作するファイルは、.npyに依存してはいけません。これは、本質的に(Python VMバイトコードのような)揮発性のフォーマットなので保証されないためです。

バイトコードをデバッグするためにリバースエンジニアリングする代わりに、これらのファイルが生成されたソースを取得してみてください。

+1

しかし、 '.npy'ファイルはPythonのバイトコードやコンパイルされたコードを保存していません。これは、データ配列属性と配列データバッファを保存しています。 Py2とPy3の間の酸洗いには互換性がありませんが、数値配列は違ってはいけません。 – hpaulj

関連する問題