web-dev-qa-db-fra.com

Rendre les tableaux numpy JSON sérialisables

J'ai un programme qui traite les données sous forme de tableaux NumPy, qui doivent être stockés sous forme JSON (pour les transmettre ultérieurement à un autre programme afin de visualiser les données). Quand j'essaye ce qui suit:

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

Je reçois un message d'erreur

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

Donc, il s'avère que les tableaux ne sont pas sérialisables. J'espérais résoudre ce problème en convertissant les tableaux en listes ordinaires, mais si j'essaie

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

Je viens d'avoir une erreur de lecture

TypeError: 3 is not JSON serializable

(Ce 3 semble être parce que '3' est le premier élément de la liste)

Encore plus étrange, cette erreur persiste lorsque j'essaie de reconstruire une liste à partir de zéro:

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)

revient toujours

TypeError: 3 is not JSON serializable

J'ai deux questions:

  1. Comment se fait-il que même ce dernier ne fonctionne pas? N'aurait-il pas dû «oublier» tout ce qui avait déjà été un tableau NumPy? Les entiers dans les tableaux NumPy ne sont-ils pas vraiment les mêmes objets que les entiers ordinaires et portent-ils une propriété invisible spéciale qui persiste même en dehors du tableau?
  2. Comment can I peut-il stocker efficacement des tableaux au format JSON (quelle que soit la complexité de la solution)?
6
user138815

Ce 3 est un entier - NumPy qui s’affiche comme un int standard Python, mais n’en est pas un. Utilisez tolist pour obtenir une liste des éléments ordinaires de Python:

json.dumps(my_array.tolist())

Cela convertira également les tableaux multidimensionnels en listes imbriquées, de sorte que vous n’aurez pas à gérer une compréhension de liste à 3 couches pour un tableau à 3 dimensions.

8
user2357112

En plus de la réponse correcte de l'utilisateur2357112 sur la manière de faire fonctionner votre code, envisagez d'étendre json pour pouvoir coder votre tableau comme spécifié here .

0
Turn