467 Stimmen

NumPy-Array ist nicht JSON-serialisierbar

Nachdem ich ein NumPy-Array erstellt und es als Django-Kontextvariable gespeichert habe, erhalte ich beim Laden der Webseite folgenden Fehler:

array([   0,  239,  479,  717,  952, 1192, 1432, 1667], dtype=int64) ist nicht JSON-serialisierbar

Was bedeutet das?

2voto

Verwende NumpyEncoder, es wird den json dump erfolgreich verarbeiten. ohne - NumPy-Array ist nicht JSON-serialisierbar

import numpy as np
import json
from numpyencoder import NumpyEncoder
arr = array([   0,  239,  479,  717,  952, 1192, 1432, 1667], dtype=int64) 
json.dumps(arr,cls=NumpyEncoder)

1voto

Roei Bahumi Punkte 2803

Hier ist eine Implementierung, die für mich funktioniert hat und alle NaNs entfernt (vorausgesetzt, es handelt sich um einfache Objekte (Liste oder Dictionary)):

from numpy import isnan

def remove_nans(my_obj, val=None):
    if isinstance(my_obj, list):
        for i, item in enumerate(my_obj):
            if isinstance(item, list) or isinstance(item, dict):
                my_obj[i] = remove_nans(my_obj[i], val=val)

            else:
                try:
                    if isnan(item):
                        my_obj[i] = val
                except Exception:
                    pass

    elif isinstance(my_obj, dict):
        for key, item in my_obj.items():
            if isinstance(item, list) or isinstance(item, dict):
                my_obj[key] = remove_nans(my_obj[key], val=val)

            else:
                try:
                    if isnan(item):
                        my_obj[key] = val
                except Exception:
                    pass

    return my_obj

1voto

KS HARSHA Punkte 67

Dies ist eine andere Antwort, aber dies könnte helfen, Menschen zu helfen, die versuchen, Daten zu speichern und dann erneut zu lesen.
Es gibt hickle, das schneller ist als pickle und einfacher.
Ich habe versucht, es in pickle dump zu speichern und zu lesen, aber beim Lesen gab es viele Probleme und ich habe eine Stunde verschwendet und keine Lösung gefunden, obwohl ich an meinen eigenen Daten gearbeitet habe, um einen Chatbot zu erstellen.

vec_x und vec_y sind Numpy-Arrays:

data=[vec_x,vec_y]
hkl.dump( data, 'new_data_file.hkl' )

Dann liest du es einfach und führst die Operationen aus:

data2 = hkl.load( 'new_data_file.hkl' )

1voto

Robert GRZELKA Punkte 109

Kann eine einfache For-Schleife mit Typüberprüfungen machen:

with open("jsondontdoit.json", 'w') as fp:
    for key in bests.keys():
        if type(bests[key]) == np.ndarray:
            bests[key] = bests[key].tolist()
            continue
        for idx in bests[key]:
            if type(bests[key][idx]) == np.ndarray:
                bests[key][idx] = bests[key][idx].tolist()
    json.dump(bests, fp)
    fp.close()

0voto

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 genannte Fehler wurde ausgelöst, als ich versuchte, eine Liste von Daten an model.predict() zu übergeben, als ich die Antwort im JSON-Format erwartete.

> 1        json_file = open('model.json','r')
> 2        loaded_model_json = json_file.read()
> 3        json_file.close()
> 4        loaded_model = model_from_json(loaded_model_json)
> 5        # Gewichte in neues Modell laden
> 6        loaded_model.load_weights("model.h5")
> 7        loaded_model.compile(optimizer='adam', loss='mean_squared_error')
> 8        X =  [[874,12450,678,0.922500,0.113569]]
> 9        d = pd.DataFrame(X)
> 10       prediction = loaded_model.predict(d)
> 11       return jsonify(prediction)

Aber glücklicherweise fand ich den Hinweis zur Behebung des Fehlers, der geworfen wurde. Die Serialisierung der Objekte gilt nur für die folgende Konvertierung. Die Zuordnung sollte wie folgt sein: Objekt - dict, Array - Liste, String - String, Integer - Integer.

Wenn Sie nach oben scrollen, um die Zeilennummer 10 zu sehen, wo diese Zeile des Codes den Ausgabetyp Array-Datentyp erzeugte, wenn Sie versuchen, das Array in das JSON-Format zu konvertieren, ist dies nicht möglich.

Schließlich fand ich die Lösung nur durch die Umwandlung des erhaltenen Ausgabes in den Typ Liste durch folgende Codezeilen

prediction = loaded_model.predict(d)
listtype = prediction.tolist() return jsonify(listtype)

Bhoom! Endlich das erwartete Ergebnis erhalten, Bildbeschreibung hier eingeben

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X