Soy nuevo en Python, que viene de MATLAB. Tengo una gran matriz dispersa guardada en el formato de matlab v7.3 (HDF5). Hasta ahora he encontrado dos maneras de cargar en el archivo, usando h5py
y tables
. Sin embargo, operar en la matriz parece ser extremadamente lento después de cualquiera. Por ejemplo, en Matlab:Cargando Matlab matriz dispersa guardado con -v7.3 (HDF5) en Python y operar en él
>> whos
Name Size Bytes Class Attributes
M 11337x133338 77124408 double sparse
>> tic, sum(M(:)); toc
Elapsed time is 0.086233 seconds.
Uso de tablas:
t = time.time()
sum(f.root.M.data)
elapsed = time.time() - t
print elapsed
35.929461956
Usando h5py:
t = time.time()
sum(f["M"]["data"])
elapsed = time.time() - t
print elapsed
(renuncié a la espera ...)
[EDIT]
Según los comentarios de @bpgergo, debo añadir que he intentado convertir el resultado cargada en por h5py
(f
) en una matriz de numpy
o una matriz dispersa scipy
de las dos maneras siguientes:
from scipy import sparse
A = sparse.csc_matrix((f["M"]["data"], f["M"]["ir"], f["tfidf"]["jc"]))
o
data = numpy.asarray(f["M"]["data"])
ir = numpy.asarray(f["M"]["ir"])
jc = numpy.asarray(f["M"]["jc"])
A = sparse.coo_matrix(data, (ir, jc))
pero ambas operaciones son extremadamente lentas también.
¿Hay algo que me falta aquí?
Cargando el archivo fue casi instantáneo en Matlab (<1seg), así que creo que la comparación fue justa, pero considero su punto acerca de la función de suma incorporada. Creo que cada vez más personas harán lo que estoy haciendo (pasar de Matlab a Python), por lo que sería bueno si hubiera un poco más de soporte para cargar en los archivos de Matlab en mi humilde opinión ... – tdc
Bueno, no puedo pruébalo sin tu archivo, pero cargar el arreglo en python también debería ser muy rápido. Lo que estás haciendo actualmente no es realmente cargarlo. Renueve lo que efectivamente es una matriz mapeada en memoria. Acceder a él de manera independiente será muy lento en cualquier idioma, ya que es principalmente disco busca. ¿El código de ejemplo anterior es lento? Además, eche un vistazo a 'scipy.io.loadmat' http://docs.scipy.org/doc/scipy/reference/generated/scipy.io.loadmat.html#scipy.io.loadmat, aunque no estoy seguro si es compatible con matrices dispersas. –
no tuve la oportunidad de probarlo, pero gracias por la entrada – tdc