Comment puis-je sérialiser un tableau numpy, tout en préservant la matrice de dimensions?
numpy.array.tostring
ne semble pas conserver les informations relatives aux dimensions de la matrice (voir cette question), demandant à l'utilisateur de lancer un appel à numpy.array.reshape
.
Est-il un moyen pour sérialiser un tableau numpy au format JSON, tout en préservant cette information?
Remarque: Les tableaux peuvent contenir des entiers, des flotteurs ou des booléens. Il est raisonnable de s'attendre à un tableau transposé.
Note 2: ce qui est fait avec l'intention de passer le tableau numpy par une Tempête de topologie à l'aide de streamparse, dans le cas où ces informations finit par être pertinentes.
- Pourquoi avez-vous downvote? Ma solution est correcte et fonctionne pour les tableaux numpy de toute dimension et de tout type de données.
- Downvotes ne viennent pas de moi. Quelqu'un a une mauvaise journée, je pense :/
- Wow...qui est downvoting une solution dans un fil de discussion où il est lui-même pas le propriétaire?^^ Alors..désolé pour la gêne occasionnée. J'espère que vous êtes heureux avec la solution 🙂
- Peut-être parce qu'il échoue sur structurée tableaux? Il faut aussi que la matrice C est contigu, et je soupçonne qu'il pourrait aussi faire la mauvaise chose si un tableau est sérialisé sur un little-endian système et désérialisé sur un big-endian système ou vice-versa, mais je n'ai pas le matériel pour vérifier. Je ne suis pas le downvoter et ne sais pas le downvoter de raisons, mais je ne voudrais pas upvote il.
- Est-il besoin d'être un format de texte? Parce que
numpy.save
etnumpy.load
(qui utilisent un format binaire) faire enregistrer la forme du tableau (et le type et l'ordre). - Il doit être JSON-sérialisable, en fait. C'est un peu une exigence de l'étrange, mais la Tempête du JSON-driven multilang protocole ne me donne pas trop le choix :/
- Eh bien, vous pourriez
save
à unStringIO
,read
laStringIO
, et de transformer les octets avec base64 ou quelque chose. - ouais, il ne fonctionnera pas sans quelques "bidouilles" sur la structure de tableaux structurés mais les tableaux (dans mon expérience) ne sont pas utilisés très souvent, et de traiter avec eux est toujours relativement complexes, comme la sérialisation de montre...
- ...et même plus important: la question était sur la sérialisation des tableaux numpy avec certains matrice dimenions (afin de flotteurs, entiers, ...). La question n'était pas comment sérialiser multi-type structuré tableaux.
- J'apprécie vos commentaires pour cette question, alors, passons à ces stupides downvoters. Il ressemble à la tendance s'est inversée, de toute façon.
- J'ai édité la question de l'essayer et de le rendre clair qu'il convient de TEMPÊTE compatible. Mais vous devriez vraiment avoir compris que. Nous ne pouvons pas lire dans les pensées. 🙂
- Merci. Mon intention était de pas pour défendre ma réponse ou offenser personne. Je voulais juste faire remarquer que, dans mon esprit, la question était de savoir comment sérialiser des tableaux numpy (flotteurs, entiers, ...) ayant des dimensions variables et non pas sur le multi-type structuré tableaux^^
- Je ne suis pas sûr si je suis d'accord avec votre dernier lot de modifications. La sérialisation JSON est suffisant pour en faire une tempête compatible; pas besoin de le rendre plus complexe qu'elle ne l'est...
- Se sentir libre de les annuler. 🙂 Mais je pense que la tempête et/ou JSON doit être mentionnée, car ils sont pertinents à la question.
- Ouais, je crois que la question est plus de savoir si vous voulez "normal" des tableaux numpy être sérialisé ou vraiment tout scipy/numpy tableau d'objets que l'on peut penser, y compris multi-type structuré des tableaux et des trucs. J'ai vraiment pensé à "normal" des tableaux lorsque j'ai lu votre question et je suppose que c'est ce que @RolandSmith voulais dire avec "STORM-compatible"?!
- fait. Je viens de penser à un sympathique heads-up serait poli 🙂
- actuellement, les tableaux d'entiers, des flotteurs et des booléens sont tout ce qui est nécessaire. Il est raisonnable de s'attendre à ce transposée tableaux. Je vais mettre à jour la question.
- C'est exactement ce que j'ai pensé quand j'ai lu votre question...pour toutes ces raisons mentionnées ma solution fonctionne bien 🙂
- Avez-vous essayé jsonpickle?
Vous devez vous connecter pour publier un commentaire.
pickle.décharges
ounumpy.enregistrer
encoder toutes les informations nécessaires pour reconstruire l'arbitraire d'un tableau NumPy, même en présence de l'endianness questions, non contigus des tableaux, ou bizarre tuple dtypes. Endianness questions sont probablement le plus important; vous ne voulez pasarray([1])
soudainement devenirarray([16777216])
parce que vous avez chargé votre tableau sur un big-endian machine.pickle
est probablement le plus pratique, maissave
a ses propres avantages, compte tenu de lanpy
format de justification.La
pickle
option:numpy.save
utilise un format binaire, et il doit écrire dans un fichier, mais vous pouvez vous déplacer qu'avecStringIO
:Et désérialiser:
json.dumps(memfile.read().decode('latin-1'))
est inclus?pickle
option; il était probablement liée à bytestring vs chaîne unicode questions.StringIO.StringIO()
avecio.BytesIO()
que allusion ici.EDIT: Comme on peut le lire dans les commentaires de la question de cette solution concerne la "normale" des tableaux numpy (flotteurs, entiers, booléens,...) et non pas avec multi-type structuré tableaux.
Solution de sérialisation d'un tableau numpy de toutes les dimensions et les types de données
Comme je sais que vous ne pouvez pas simplement sérialiser un tableau numpy avec n'importe quel type de données et les dimensions...mais vous pouvez stocker ses données, le type, la dimension et de l'information dans une liste à la représentation et puis sérialiser en utilisant JSON.
Les importations nécessaires:
Pour l'encodage vous pourriez utiliser (
nparray
est quelques un tableau numpy de tout type de données et de toute dimension):Après cela, vous obtenez un JSON dump (string) de vos données, contenant une liste à la représentation de son type de données et la forme ainsi que les tableaux de données/contenus encodés en base64.
Et pour le décodage ce fait le travail (
encStr
est codé chaîne JSON, chargé à partir de quelque part):JSON dumps sont efficaces et de la croix-compatible pour de nombreuses raisons, mais juste de prendre JSON conduit à des résultats inattendus si vous souhaitez stocker et charger les tableaux numpy de tout type et toute dimension.
Cette solution, les magasins et les charges des tableaux numpy quel que soit le type ou dimension et restaure correctement (type de données, dimension, ...)
J'ai essayé plusieurs solutions de moi-même il y a des mois et c'était la seule efficace, polyvalent solution je suis venu à travers.
J'ai trouvé le code dans Msgpack-numpy utile.
https://github.com/lebedov/msgpack-numpy/blob/master/msgpack_numpy.py
J'ai modifié le sérialisés dict légèrement et ajout de l'encodage base64 pour réduire la sérialisés taille.
À l'aide de la même interface que le json (offrant charge(s),dump(s)), vous pouvez fournir une baisse-dans le remplacement pour la sérialisation json.
Cette même logique peut être étendu à l'ajout automatique de la non-trivial de la sérialisation, tels que les objets datetime.
MODIFIER
J'ai écrit un générique, modulaire, analyseur qui fait cela, et plus encore.
https://github.com/someones/jaweson
Mon code est comme suit:
np_json.py
Vous devriez être en mesure de procéder de la façon suivante:
Msgpack a le meilleur de la sérialisation de la performance: http://www.benfrederickson.com/dont-pickle-your-data/
Utilisation msgpack-numpy. Voir https://github.com/lebedov/msgpack-numpy
L'installer:
Alors:
Si elle doit être lisible par l'homme et vous savez que c'est un tableau numpy:
Peut-être pas le plus efficace à mesure que le tableau des tailles de grandir, mais travaille pour les plus petits tableaux.
Essayer
traitschema
https://traitschema.readthedocs.io/en/latest/Essayez d'utiliser
numpy.array_repr
ounumpy.array_str
.numpy.set_printoptions
.