Para todos los votos de la respuesta mmwrite
, me sorprende que nadie haya intentado responder la pregunta real. Pero como se ha reactivado, lo intentaré.
Esto reproduce el caso OP:
In [90]: x=sparse.csr_matrix(np.arange(10).reshape(2,5))
In [91]: np.save('save_sparse.npy',x)
In [92]: X=np.load('save_sparse.npy')
In [95]: X
Out[95]:
array(<2x5 sparse matrix of type '<type 'numpy.int32'>'
with 9 stored elements in Compressed Sparse Row format>, dtype=object)
In [96]: X[()].A
Out[96]:
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
In [93]: X[()].A
Out[93]:
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
In [94]: x
Out[94]:
<2x5 sparse matrix of type '<type 'numpy.int32'>'
with 9 stored elements in Compressed Sparse Row format
El [()]
que `user4713166 dio nosotros no es un 'camino difícil' para extraer la matriz dispersa.
np.save
y np.load
están diseñados para funcionar en ndarrays. Pero una matriz dispersa no es una matriz, ni es una subclase (como es np.matrix
). Parece que np.save
envuelve el objeto que no es de matriz en un object dtype array
y lo guarda junto con una forma del objeto en escabeche.
Cuando intento para salvar a un tipo diferente de objeto, una que no puede ser conservado en vinagre, me sale un mensaje de error en:
403 # We contain Python objects so we cannot write out the data directly.
404 # Instead, we will pickle it out with version 2 of the pickle protocol.
-> 405 pickle.dump (array, fp, el protocolo = 2)
Respondiendo a Is Scipy smart enough to understand that it has loaded a sparse array?
, no. np.load
no sabe acerca de las matrices dispersas.Pero np.save
es lo suficientemente inteligente para despejar cuando se le da algo que no es una matriz, y np.load
hace lo que puede con lo que encuentra en el archivo.
En cuanto a los métodos alternativos para guardar y cargar matrices dispersas, se ha mencionado el io.savemat
, método compatible con MATLAB. Sería mi primera elección. Pero este ejemplo también muestra que puede usar el Python pickling
normal. Eso podría ser mejor si necesita guardar un formato disperso particular. Y np.save
no está mal si puede vivir con el paso de extracción [()]
. :)
https://github.com/scipy/scipy/blob/master/scipy/io/matlab/mio5.py write_sparse
- escasa se guardan en formato csc
. Junto con los encabezados guarda A.indices.astype('i4'))
, A.indptr.astype('i4'))
, A.data.real
y opcionalmente A.data.imag
.
En las pruebas rápidas encuentro que np.save/load
maneja todos los formatos escasas, excepto dok
, donde el load
se queja de una falta shape
. De lo contrario, no encontraré ningún código de decapado especial en los archivos dispersos.
+1, 'scipy.io' es la solución adecuada. Yo agregaría que si quieres ir por el camino de la optimización, podrías considerar 'numpy.load (mmap_mode = 'r'/'c')'. La asignación de memoria de los archivos del disco proporciona una carga instantánea ** y ** puede ahorrar memoria, ya que la misma matriz mapeada en memoria se puede compartir en múltiples procesos. – Radim
scipy.io.savemat es probablemente el mejor – mathtick
Usar np_savez en vez de mm disminuyó el tiempo de carga de una gran matriz dispersa de 8min47 a 3s. Gracias ! También probé savez_compressed pero el tamaño es el mismo y el tiempo de carga mucho más largo. – MatthieuBizien