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?

490voto

travelingbones Punkte 7045

Ich "jsonifiziere" regelmäßig np.arrays. Versuchen Sie zuerst, die Methode ".tolist()" auf die Arrays anzuwenden, wie hier:

import numpy as np
import codecs, json 

a = np.arange(10).reshape(2,5) # ein 2 mal 5 Array
b = a.tolist() # verschachtelte Listen mit denselben Daten, Indizes
file_path = "/pfad.json" ## Ihre Pfad-Variable
json.dump(b, codecs.open(file_path, 'w', encoding='utf-8'), 
          separators=(',', ':'), 
          sort_keys=True, 
          indent=4) ### dies speichert das Array im .json-Format

Um das Array "unjsonifizieren" zu können, verwenden Sie:

obj_text = codecs.open(file_path, 'r', encoding='utf-8').read()
b_new = json.loads(obj_text)
a_new = np.array(b_new)

459voto

karlB Punkte 3491

Speichern Sie als JSON ein numpy.ndarray oder jede verschachtelte Listenkomposition.

class NumpyEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, np.ndarray):
            return obj.tolist()
        return json.JSONEncoder.default(self, obj)

a = np.array([[1, 2, 3], [4, 5, 6]])
print(a.shape)
json_dump = json.dumps({'a': a, 'aa': [2, (2, 3, 4), a], 'bb': [2]}, 
                       cls=NumpyEncoder)
print(json_dump)

Das Ergebnis wird sein:

(2, 3)
{"a": [[1, 2, 3], [4, 5, 6]], "aa": [2, [2, 3, 4], [[1, 2, 3], [4, 5, 6]]], "bb": [2]}

Um aus JSON wiederherzustellen:

json_load = json.loads(json_dump)
a_restored = np.asarray(json_load["a"])
print(a_restored)
print(a_restored.shape)

Das Ergebnis wird sein:

[[1 2 3]
 [4 5 6]]
(2, 3)

104voto

tsveti_iko Punkte 4970

Ich habe die beste Lösung gefunden, wenn Sie verschachtelte numpy-Arrays in einem Dictionary haben:

import json
import numpy as np

class NumpyEncoder(json.JSONEncoder):
    """ Spezieller JSON-Encoder für numpy-Typen """
    def default(self, obj):
        if isinstance(obj, np.integer):
            return int(obj)
        elif isinstance(obj, np.floating):
            return float(obj)
        elif isinstance(obj, np.ndarray):
            return obj.tolist()
        return json.JSONEncoder.default(self, obj)

dumped = json.dumps(data, cls=NumpyEncoder)

with open(path, 'w') as f:
    json.dump(dumped, f)

Dank diesem Typ.

75voto

John Zwinck Punkte 221200

Sie können Pandas verwenden:

import pandas as pd
pd.Series(Ihr_Array).to_json(orient='values')

54voto

moshevi Punkte 3718

Verwenden Sie das json.dumps default kwarg:

default sollte eine Funktion sein, die für Objekte aufgerufen wird, die sonst nicht serialisiert werden können. ... oder löse einen TypeError aus

In der default Funktion überprüfen Sie, ob das Objekt aus dem Modul numpy stammt, falls ja, verwenden Sie entweder ndarray.tolist für ein ndarray oder verwenden Sie .item für jeden anderen numpy-spezifischen Typ.

import numpy as np

def default(obj):
    if type(obj).__module__ == np.__name__:
        if isinstance(obj, np.ndarray):
            return obj.tolist()
        else:
            return obj.item()
    raise TypeError('Unbekannter Typ:', type(obj))

dumped = json.dumps(data, default=default)

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