2016-07-11 6 views
3

Ich habe die folgenden Daten in Python 2 geschrieben, die ich in eine Python 3-Datei laden möchte.Problem mit numpy.load

import numpy as np 
x = np.array([{'a': np.array([1., 2., 3])}]) 
np.save('data.npy', x) 

Mein erster Versuch war:

import numpy as np 
x = np.load('data.npy') 

UnicodeError: Unpickling a python object failed 

Nach Herumspielen mit den ursprünglichen Daten, die ich geladen bin versucht, so scheint es, dass, wenn ich einen numpy Schwimmer innerhalb eines numpy Array in einem Python Wörterbuch, ich bekomme den Fehler. Ich kann ein Dictionary laden, ich kann ein numpy Array laden, ich kann sogar ein numpy Array in ein Python-Dictionary laden, aber sobald ich numpy floats in einem numpy Array innerhalb eines Python-Dictionary habe, bekomme ich den Fehler. Mein zweiter Versuch war:

import numpy as np 
x = np.load('data.npy', encoding = 'bytes') 
x 

array([{b'a': array([ 1., 2., 3.])}], dtype=object) 

Das funktionierte, dass ich die Daten geladen werden konnte, aber es hat im Wörterbuch ein ‚b‘ vor jedem Schlüssel. Ich habe mich gefragt, ob irgendjemand einen Einblick hatte, warum dieses Problem auftritt und wie man es beheben kann.

Danke!

edit:

es scheint, wie die folgenden das Problem gelöst:

import numpy as np 
x = np.load('data.npy', encoding = 'latin1') 
+1

Das b ist nicht wirklich Teil des Schlüssels. Es zeigt an, dass die Zeichenfolge eine Zeichenfolge aus Bytes ist. So ist b'a 'eine Zeichenfolge mit einem Byte, das den Buchstaben a darstellt. Dies ist vergleichbar mit Unicode-Strings, die zumindest in Python 2.x wie 'u'a' aussehen. – bigblind

+1

Es gab einen Kommentar (ich glaube, es wurde gelöscht?), Was darauf hindeutet, dass Sie versuchen sollten, codierung = 'str' anstelle von encoding = 'bytes' zu verwenden. Encoding = 'str' ist ungültig, aber encoding = 'latin1' scheint zu funktionieren. – Zhaitan

Antwort

5

Die Standard-Codierung in Python 2 ist ascii; In Python 3 ist es utf-8. latin1 (a.k.a., ISO-8859-1) ist eine Obermenge von ascii. Deshalb funktioniert das Laden von ascii-codierten Strings mit latin1 und liefert das gleiche Ergebnis wie das Laden mit ascii.

+1

Der Standardwert für die Codierung ist 'ASCII', was ich beim ersten Versuch versucht habe. Aber das Einstellen der Kodierung auf 'latin1' hat funktioniert – Zhaitan

+0

'latin1' ist eine Erweiterung von' ascii' --- siehe bearbeiten. –