Enregistrer / charger scipy éparses csr_matrix portable de format de données
Comment enregistrer/charger une scipy éparses csr_matrix
dans un format portable? Le scipy sparse matrix est créé sur Python 3 (Windows 64-bit) pour s'exécuter sur Python 2 (Linux 64-bit). D'abord, j'ai utilisé cornichon (avec protocole=2 et fix_imports=Vrai), mais ce n'était pas le travail de Python 3.2.2 (Windows 64-bit) pour Python 2.7.2 (Windows 32 bits) et a obtenu l'erreur:
TypeError: ('data type not understood', <built-in function _reconstruct>, (<type 'numpy.ndarray'>, (0,), '[98]')).
Prochaine, essayé numpy.save
et numpy.load
ainsi que scipy.io.mmwrite()
et scipy.io.mmread()
et aucune de ces méthodes travaillé.
- mmwrite/mmread devrait fonctionner, comme c'est un format de fichier texte. le problème possible avec Linux vs Windows peut être de fins de ligne, CRLF vs LF
Vous devez vous connecter pour publier un commentaire.
edit: SciPy 1.19 a maintenant
scipy.éparses.save_npz
etscipy.éparses.load_npz
.Pour les deux fonctions, la
file
argument peut également être un fichier-comme l'objet (c'est à dire le résultat deopen
) au lieu d'un nom de fichier.Obtenu une réponse de la Scipy groupe d'utilisateurs:
Ainsi, par exemple:
if not filename.endswith('.npz'): filename += '.npz'
scipy.sparse.save_npz
etload
.Si vous écrivez,
scipy.io.mmwrite
etscipy.io.mmread
ne fonctionnent pas pour vous, je veux juste ajouter que la façon dont ils travaillent. Cette question est non. 1 Google a frappé, donc je me suis mis avecnp.savez
etpickle.dump
avant de passer à la simple et évidente scipy-fonctions. Ils travaillent pour moi et ne devrait pas être supervisé par ceux qui n'ont pas essayé encore.import scipy
. Explicitefrom scipy import io
ouimport scipy.io
est nécessaire.np.savez
etcPickle
des solutions, et de produire des ~3x plus gros fichier. Merci de voir ma réponse pour les détails du test.Ici est de comparer la performance des trois plus upvoted réponses à l'aide de Jupyter ordinateur portable. L'entrée est un 1M x 100K aléatoire sparse matrix avec la densité de 0,001, contenant 100 M des valeurs non nulles:
io.mmwrite
/io.mmread
(notez que le format a été modifié à partir de la rse à coo).
np.savez
/np.load
cPickle
Note: cPickle ne fonctionne pas avec les objets de très grande taille (voir cette réponse).
Dans mon expérience, il n'a pas de travail pour 2,7 M x 50 k de la matrice avec 270M des valeurs non nulles.
np.savez
solution a bien fonctionné.Conclusion
(basé sur le test simple pour la RSE matrices)
cPickle
est la méthode la plus rapide, mais il ne fonctionne pas avec les très grandes matrices,np.savez
est seulement légèrement plus lente, tandis queio.mmwrite
est beaucoup plus lent, produit des fichiers plus gros et rétablit le mauvais format. Doncnp.savez
est le gagnant ici.from scipy.sparse import io
ne fonctionne pas. Au lieu de cela, il suffit de nefrom scipy import io
. Docsscipy
.Maintenant, vous pouvez utiliser
scipy.sparse.save_npz
:https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.save_npz.html
En supposant que vous avez scipy sur les deux machines, vous pouvez simplement utiliser
pickle
.Cependant, assurez-vous de spécifier un protocole binaire lorsque le décapage des tableaux numpy. Sinon vous vous retrouverez avec un énorme fichier.
À tout le moins, vous devriez être en mesure de le faire:
Vous pouvez le charger avec:
cPickle
ne fonctionne pas avec les très grandes matrices (lien).Que de scipy 0.19.0, vous pouvez enregistrer et charger des matrices creuses de cette façon:
Ajouter mon grain de sel: pour moi,
npz
n'est pas portable que je ne peux pas l'utiliser pour exporter mon matrice facilement à la non-Python clients (par exemple, PostgreSQL -- heureux d'être corrigé). Donc j'aurais aimé obtenir de sortie CSV pour les matrices creuses (comme vous l'obtenir vousprint()
la matrice creuse). Comment atteindre cet objectif dépend de la représentation de la matrice creuse. Pour une RSE de la matrice, le code suivant crache de sortie CSV. Vous pouvez l'adapter pour d'autres représentations.C'est environ 2 fois plus lent que
save_npz
dans l'implémentation actuelle, de ce que j'ai testé.C'est ce que j'ai utilisé pour enregistrer un
lil_matrix
.Je dois dire que j'ai trouvé NumPy est np.charge(..) pour très lent. C'est ma solution actuelle, je me sens tourne beaucoup plus vite:
M'a demandé d'envoyer la matrice en une simple et générique format:
J'ai fini avec cela: