Après avoir créé un tableau NumPy et l'avoir enregistré en tant que variable de contexte Django, je reçois l'erreur suivante lors du chargement de la page Web:
array([ 0, 239, 479, 717, 952, 1192, 1432, 1667], dtype=int64) is not JSON serializable
Qu'est-ce que ça veut dire?
json
module. Mais cenumpy.ndarray
n'est pas un type quijson
sait gérer. Vous devrez soit écrire votre propre sérialiseur, soit (plus simplement) simplement passerlist(your_array)
à ce qui écrit le json.list(your_array)
ne fonctionnera pas toujours car elle renvoie des nombres entiers, pas des nombres natifs. Utilisezyour_array.to_list()
plutôt.Réponses:
Je "jsonify" régulièrement np.arrays. Essayez d'abord d'utiliser la méthode ".tolist ()" sur les tableaux, comme ceci:
Afin de "déconsidérer" l'utilisation du tableau:
la source
tolist()
.tolist()
prend énormément de temps lorsque les données sont volumineuses.Stockez en JSON un numpy.ndarray ou toute composition de liste imbriquée.
Sortira:
Pour restaurer à partir de JSON:
Sortira:
la source
numpy.asarray()
?if isinstance(obj, np.float32) or isinstance(obj, np.float64): return float(obj)
Vous pouvez utiliser Pandas :
la source
pd.DataFrame(your_array).to_json('data.json', orient='split')
.J'ai trouvé la meilleure solution si vous avez imbriqué des tableaux numpy dans un dictionnaire:
Merci à ce gars .
la source
json
verso, vous pouvez utiliser ceciwith open(path, 'r') as f:
data = json.load(f)
:, qui renvoie un dictionnaire avec vos données.json
fichier, puis pour désérialiser sa sortie, vous pouvez utiliser ceci:data = json.loads(data)
Utilisez le
json.dumps
default
kwarg:Dans la
default
fonction, vérifiez si l'objet provient du module numpy, si c'est le cas, utilisez-lendarray.tolist
pour unndarray
ou utilisez-le.item
pour tout autre type spécifique à numpy.la source
type(obj).__module__ == np.__name__:
là-bas? Ne suffirait-il pas de vérifier l'instance?.item
pour presque n'importe quel objet numpy.default
est appelée pour toutes lesjson.dumps
tentatives de sérialisation de types inconnus . pas seulement engourdiCe n'est pas pris en charge par défaut, mais vous pouvez le faire fonctionner assez facilement! Il y a plusieurs choses que vous voudrez encoder si vous voulez récupérer exactement les mêmes données:
obj.tolist()
@travelingbones mentionné. Parfois, cela peut suffire.De plus, votre tableau numpy pourrait faire partie de votre structure de données, par exemple, vous avez une liste avec quelques matrices à l'intérieur. Pour cela, vous pouvez utiliser un encodeur personnalisé qui fait essentiellement ce qui précède.
Cela devrait être suffisant pour implémenter une solution. Ou vous pouvez utiliser json-tricks qui fait exactement cela (et prend en charge divers autres types) (avertissement: je l'ai fait).
ensuite
la source
J'ai eu un problème similaire avec un dictionnaire imbriqué contenant quelques numpy.ndarrays.
la source
Vous pouvez également utiliser l'
default
argument par exemple:la source
En outre, quelques informations très intéressantes sur les listes et les tableaux en Python ~> Liste Python vs tableau - quand l'utiliser?
On peut noter qu'une fois que j'ai converti mes tableaux en liste avant de l'enregistrer dans un fichier JSON, dans mon déploiement en ce moment en tout cas, une fois que j'ai lu ce fichier JSON pour l'utiliser plus tard, je peux continuer à l'utiliser sous forme de liste (comme plutôt que de le reconvertir en tableau).
ET semble en fait plus agréable (à mon avis) à l'écran comme une liste (virgule séparée) par rapport à un tableau (non virgule séparée) de cette façon.
En utilisant la méthode .tolist () de @ travellingbones ci-dessus, j'ai utilisé en tant que telle (en détectant quelques erreurs que j'ai également trouvées):
SAUVEGARDER LE DICTIONNAIRE
LIRE LE DICTIONNAIRE
J'espère que cela t'aides!
la source
Voici une implémentation qui fonctionne pour moi et a supprimé tous les nans (en supposant qu'il s'agit d'un objet simple (liste ou dict)):
la source
Il s'agit d'une réponse différente, mais cela pourrait aider les personnes qui tentent de sauvegarder des données, puis de les relire.
Il y a le hickle qui est plus rapide que le cornichon et plus facile.
J'ai essayé de l'enregistrer et de le lire dans un dépotoir, mais pendant la lecture, il y avait beaucoup de problèmes et j'ai perdu une heure et je n'ai toujours pas trouvé de solution même si je travaillais sur mes propres données pour créer un chat bot.
vec_x
etvec_y
sont des tableaux numpy:Ensuite, il vous suffit de le lire et d'effectuer les opérations:
la source
Peut faire simple pour boucle avec vérification des types:
la source
utilisez NumpyEncoder, il traitera le vidage json avec succès. sans lancer - Le tableau NumPy n'est pas sérialisable JSON
la source
TypeError: array ([[0.46872085, 0.67374235, 1.0218339, 0.13210179, 0.5440686, 0.9140083, 0.58720225, 0.2199381]], dtype = float32) n'est pas sérialisable JSON
L'erreur mentionnée ci-dessus a été levée lorsque j'ai essayé de transmettre la liste des données à model.predict () alors que j'attendais la réponse au format json.
Mais heureusement, j'ai trouvé le conseil pour résoudre l'erreur qui se produisait La sérialisation des objets n'est applicable que pour la conversion suivante Le mappage devrait être de la manière suivante objet - tableau dict - liste chaîne - chaîne entière - chaîne entière
Si vous faites défiler vers le haut pour voir la ligne numéro 10 prédiction = modèle_chargé.prédict (d) où cette ligne de code générait la sortie de type type de données de tableau, lorsque vous essayez de convertir un tableau au format json, ce n'est pas possible
Enfin, j'ai trouvé la solution simplement en convertissant la sortie obtenue en liste de types en suivant les lignes de code
Boom! a finalement obtenu la sortie attendue,
la source