2017-06-16 3 views
1

Laden Ich habe .npy Dateien, die mit Python erstellt wurden, 2.7.9 und Numpy Version 1.11.3 mit dem Befehl np.save('filename'). Die Dateien wurden auf einer externen Maschine erstellt, die Teil des Linux-Clusters unseres Instituts ist. Ich habe die Dateien auf meinen lokalen Rechner kopiert, um sie über zu importieren. Auf meinem lokalen Rechner laufe ich Python 3.5.2 und Numpy Version 1.13.0 mit Jupyter-Notebook. Das lokale Betriebssystem ist Ubuntu 16.04.2.Fehler, wenn ein Python 2 .npy Datei in Python 3

Wenn ich versuche, die Dateien zu laden lokal erhalte ich die Fehlermeldung:

ValueError: invalid literal for int() with base 16 

Nach dem Surfen durch einige Stackoverflow Fragen, die ich versuchte, die Codierung angeben mit:

np.load('filename.npy',encoding='latin1') 

Dies gibt den gleichen Fehler . encoding='bytes' ergibt:

TypeError: can't multiply sequence by non-int of type 'float' 

Hier ist ein größerer Ausschnitt aus der 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' 

Ich denke, dass etwas mit der Codierung ging schief auf dem Übergang zwischen dem Python und Numpy Versionen. Irgendwelche Ideen, wie ich die Dateien importieren kann?

+0

Sie können Python 2 Numpy Bytecode in Python 3 nicht laden, oder umgekehrt, es macht einfach keinen Sinn zu versuchen. Haben Sie versucht, die .npy-Dateien in Python 2 zu laden? weil Sie bereits Python 2 installiert haben, wenn Sie ubuntu verwenden – cat

+0

Ist es generell unmöglich? Ich glaube, ich habe Python 2 .npy-Dateien zuvor in Python 3 importiert und alles lief reibungslos. Ich kann nicht mit Sicherheit sagen, warum es vorher nicht zu einem Fehler geführt hat ... Das Laden der Dateien in Python 2 funktioniert. (Ich füge '%% python2' am Anfang der Notebook-Zelle ein, um dies zu tun). Aber die Verwendung von Python 2 führt zu weiteren Fehlern, so dass ich nach einer Lösung für Python 3 für die Verwendung dieser Dateien suchte. –

+1

Wissen Sie, was in dieser Datei enthalten ist? Nur ein numerisches Array? Oder eine Art "Objekt".Der Fehler ist in 'pickle_load' und deutet auf den späteren hin. "np.save" -Dokumente weisen einige Vorsichtsmaßnahmen hinsichtlich der PY2/3-Kompatibilität beim Beizen von Objekten auf. – hpaulj

Antwort

1

Wie in What is the way data is stored in *.npy? gezeigt, .npy Dateien sind Bytecode, die Sie sehen, wenn Sie ein in einem Hex-Editor öffnen.

Python 2 Bytecode .pyc, .pyo Dateien können nicht in Python 3 ausgeführt werden, da sich die Interna der virtuellen Maschine und des Compilers mit der Hauptversion geändert haben.

Ebenso haben NumPy der C-Interna und Bytecode-Compiler als auch in Python 3 geändert, die Abwärtskompatibilität zu brechen. (Dies ist beabsichtigt, da Bytecode nicht so lange persistent sein soll oder in anderen Versionen als er erstellt wurde.)

Die Zusammensetzung dieser Änderungen bedeutet, dass es keine Möglichkeit gibt, ohne große Änderungen am Bytecode von Python 3 Dolmetscher und NumPy Python 3 und/oder ein Transpiler von Python 2 NumPy Bytecode zu der Python 3, diese Python 2 .npy Dateien in Python zu verwenden 3.


Wie ich bereits angedeutet, ist dies ein Bit eines X/Y Problem. Sie sollten nicht darauf angewiesen sein, dass die .npy Dateien über mehrere Versionen hinweg funktionieren, da dies nicht garantiert ist, da sie von Natur aus ein flüchtiges Format haben (wie Python VM Bytecode).

Statt Reverse-Engineering der Bytecode es zu debuggen, versuchen, die Quelle zu erhalten, aus denen diese Dateien generiert wurden.

+1

Aber eine '.npy'-Datei speichert keine Python-Bytecodes oder kompilierten Code. Es speichert Daten - Array-Attribute und den Array-Datenpuffer. Es gibt Inkompatibilitäten beim Einfügen zwischen Py2 und Py3, aber numerische Arrays sollten nicht unterschiedlich sein. – hpaulj