it-swarm.com.de

Erstellen von numpy Arrays JSON serialisierbar

Ich habe ein Programm, das Daten in Form von NumPy-Arrays verarbeitet, die in JSON-Form gespeichert werden müssen (um sie später an ein anderes Programm zu übergeben, um die Daten zu visualisieren). Wenn ich folgendes probiere:

my_array = np.array([3, 4, 5])
json.dumps(my_array)

Ich bekomme eine Fehlermeldung beim Lesen

TypeError: array([3, 4, 5]) is not JSON serializable

Es stellt sich also heraus, dass Arrays nicht serialisierbar sind. Ich habe gehofft, das zu lösen, indem ich die Arrays in normale Listen umwandle, aber wenn ich es versuche

my_array = np.array([3, 4, 5])
my_list = list(my_array)
json.dumps(my_list)

Ich bekomme nur einen Fehler beim Lesen

TypeError: 3 is not JSON serializable

(Dieser 3 scheint zu sein, weil '3' das erste Element der Liste ist.)

Selbst wenn ich versuche, eine Liste von Grund auf zu rekonstruieren, bleibt dieser Fehler bestehen:

def plain_list(ls):
  pl = []
  for element in ls:
    pl.append(element)
  return pl

my_array = np.array([3, 4, 5])
my_list = plain_list(my_array)
json.dumps(my_list)

kehrt immer noch zurück

TypeError: 3 is not JSON serializable

Ich habe zwei Fragen:

  1. Wie funktioniert es, dass auch das letzte nicht funktioniert? Sollte es nicht alles "vergessen" haben, jemals ein NumPy-Array gewesen zu sein? Sind Ganzzahlen in NumPy-Arrays nicht wirklich dieselben Objekte wie gewöhnliche Ganzzahlen, und führen sie spezielle unsichtbare Eigenschaften mit sich, die auch außerhalb des Arrays bestehen bleiben?
  2. Wie can speichere ich Arrays effektiv in JSON-Form (egal wie kompliziert die Lösung sein muss)?
6
user138815

Dieser 3 ist eine NumPy-Ganzzahl , die wie ein regulärer Python-Int angezeigt wird, aber keiner ist. Verwenden Sie tolist , um eine Liste der üblichen Python-Ints zu erhalten:

json.dumps(my_array.tolist())

Dadurch werden auch mehrdimensionale Arrays in verschachtelte Listen konvertiert, sodass Sie sich nicht mit einem 3-Layer-Listenverständnis für ein dreidimensionales Array befassen müssen.

8
user2357112

Erwägen Sie zusätzlich zur korrekten Antwort von user2357112, wie Sie Ihren Code gezielt zum Laufen bringen, die Erweiterung json, um Ihr Array wie angegeben zu codieren: here .

0
Turn