Nach dem Erstellen eines NumPy-Arrays und dem Speichern als Django-Kontextvariable wird beim Laden der Webseite die folgende Fehlermeldung angezeigt:
array([ 0, 239, 479, 717, 952, 1192, 1432, 1667], dtype=int64) is not JSON serializable
Was bedeutet das?
json
Modul zu sichern . Istnumpy.ndarray
aber kein Typ, derjson
weiß, wie man damit umgeht. Sie müssen entweder Ihren eigenen Serializer schreiben oder (einfacher) einfach an das übergebenlist(your_array)
, was den JSON schreibt.list(your_array)
funktioniert nicht immer, da es numpy Ints zurückgibt, nicht native Ints. Verwenden Sieyour_array.to_list()
stattdessen.Antworten:
Ich "jsonify" regelmäßig np.arrays. Versuchen Sie zunächst, die Methode ".tolist ()" für die Arrays wie folgt zu verwenden:
Um das Array zu "unjsonifizieren", verwenden Sie:
quelle
tolist()
.tolist()
sehr viel Zeit in Anspruch nimmt, wenn die Daten groß sind.Speichern Sie als JSON eine numpy.ndarray oder eine beliebige Komposition mit verschachtelten Listen.
Wird ausgegeben:
So stellen Sie von JSON wieder her:
Wird ausgegeben:
quelle
numpy.asarray()
?if isinstance(obj, np.float32) or isinstance(obj, np.float64): return float(obj)
Sie können Pandas verwenden :
quelle
pd.DataFrame(your_array).to_json('data.json', orient='split')
.Ich habe die beste Lösung gefunden, wenn Sie Numpy-Arrays in einem Wörterbuch verschachtelt haben:
Danke an diesen Kerl .
quelle
json
können Sie natürlich Folgendes verwenden :with open(path, 'r') as f:
data = json.load(f)
, das ein Wörterbuch mit Ihren Daten zurückgibt.json
Datei und zum Deserialisieren der Ausgabe können Siedata = json.loads(data)
Benutze den
json.dumps
default
Kwarg:default
Überprüfen Sie in der Funktion, ob das Objekt aus dem Modul numpy stammt, wenn ja, verwenden Sie es entwederndarray.tolist
für einenndarray
oder.item
für einen anderen numpy-spezifischen Typ.quelle
type(obj).__module__ == np.__name__:
dort? Wäre es nicht ausreichend, nach der Instanz zu suchen?.item
für fast jedes Numpy-Objekt verwenden.default
Die Funktion wird für allejson.dumps
Versuche unbekannter Typen aufgerufen, zu serialisieren. nicht nur numpyDies wird standardmäßig nicht unterstützt, aber Sie können es ganz einfach zum Laufen bringen! Es gibt mehrere Dinge, die Sie codieren möchten, wenn Sie genau dieselben Daten zurückhaben möchten:
obj.tolist()
@travelingbones erhalten können. Manchmal kann das gut genug sein.Darüber hinaus könnte Ihr Numpy-Array Teil Ihrer Datenstruktur sein, z. B. haben Sie eine Liste mit einigen Matrizen. Dafür können Sie einen benutzerdefinierten Encoder verwenden, der im Grunde das oben Genannte tut.
Dies sollte ausreichen, um eine Lösung zu implementieren. Oder Sie könnten json-Tricks verwenden, die genau dies tun (und verschiedene andere Typen unterstützen) (Haftungsausschluss: Ich habe es geschafft).
Dann
quelle
Ich hatte ein ähnliches Problem mit einem verschachtelten Wörterbuch mit einigen numpy.ndarrays.
quelle
Sie können auch
default
Argumente verwenden, zum Beispiel:quelle
Außerdem einige sehr interessante Informationen weiter zu Listen vs. Arrays in Python ~> Python List vs. Array - wann verwenden?
Es kann angemerkt werden, dass ich, sobald ich meine Arrays in eine Liste konvertiere, bevor ich sie in einer JSON-Datei speichere, in meiner Bereitstellung, sobald ich diese JSON-Datei zur späteren Verwendung gelesen habe, sie weiterhin in einer Listenform (as) verwenden kann im Gegensatz zur Rückkonvertierung in ein Array).
UND sieht auf dem Bildschirm tatsächlich besser aus (meiner Meinung nach) als Liste (durch Kommas getrennt) im Vergleich zu einem Array (ohne Komma getrennt) auf diese Weise.
Mit der oben genannten .tolist () -Methode von @ travellingbones habe ich sie als solche verwendet (wobei ich auch einige Fehler gefunden habe, die ich gefunden habe):
WÖRTERBUCH SPEICHERN
WÖRTERBUCH LESEN
Hoffe das hilft!
quelle
Hier ist eine Implementierung, die für mich funktioniert und alle Nans entfernt hat (vorausgesetzt, es handelt sich um einfache Objekte (Liste oder Diktat)):
quelle
Dies ist eine andere Antwort, aber dies kann Menschen helfen, die versuchen, Daten zu speichern und sie dann erneut zu lesen.
Es gibt Hickle, das schneller als Pickle und einfacher ist.
Ich habe versucht, es in Pickle Dump zu speichern und zu lesen, aber beim Lesen gab es viele Probleme und es wurde eine Stunde verschwendet und ich fand immer noch keine Lösung, obwohl ich an meinen eigenen Daten arbeitete, um einen Chat-Bot zu erstellen.
vec_x
undvec_y
sind numpy Arrays:Dann lesen Sie es einfach und führen die Operationen aus:
quelle
Kann einfach für Schleife mit Prüftypen tun:
quelle
Verwenden Sie NumpyEncoder, um den JSON-Dump erfolgreich zu verarbeiten. Ohne zu werfen - Das NumPy-Array ist nicht JSON-serialisierbar
quelle
TypeError: Array ([[0.46872085, 0.67374235, 1.0218339, 0.13210179, 0.5440686, 0.9140083, 0.58720225, 0.2199381]], dtype = float32) ist nicht JSON-serialisierbar
Der oben erwähnte Fehler wurde ausgelöst, als ich versuchte, die Liste der Daten an model.predict () zu übergeben, als ich die Antwort im JSON-Format erwartete.
Glücklicherweise wurde der Hinweis gefunden, um den Fehler zu beheben, der ausgelöst wurde. Die Serialisierung der Objekte gilt nur für die folgende Konvertierung. Die Zuordnung sollte folgendermaßen erfolgen: Objekt - Diktat Array - Liste Zeichenfolge - Zeichenfolge Ganzzahl - Ganzzahl
Wenn Sie nach oben scrollen, um die Zeilennummer 10 zu sehen, wird die Vorhersage = load_model.predict (d) angezeigt, in der diese Codezeile die Ausgabe des Datentyps Array generiert hat. Wenn Sie versuchen, das Array in das JSON-Format zu konvertieren, ist dies nicht möglich
Schließlich fand ich die Lösung, indem ich die erhaltene Ausgabe durch Befolgen der Codezeilen in die Typliste konvertierte
Bhoom! endlich die erwartete Leistung bekommen,
quelle