2011-12-06 13 views
5

Matlab'dan gelen python'a yeniyim. Matlab v7.3 (HDF5) formatında kaydedilmiş büyük bir seyrek matrisim var. Şu ana kadar, dosyada h5py ve tables kullanarak iki yükleme yolu buldum. Ancak matris üzerinde çalışmak her ikisinden sonra da oldukça yavaş görünüyor.Yükleme Matlab seyrek matrisi, -v7.3 (HDF5) ile Python'a kaydedildi ve üzerinde çalışıyor

>> whos  
    Name   Size     Bytes Class  Attributes 

    M  11337x133338   77124408 double sparse  

>> tic, sum(M(:)); toc 
Elapsed time is 0.086233 seconds. 

kullanma masaları: Örneğin, Matlab'de

t = time.time() 
sum(f.root.M.data) 
elapsed = time.time() - t 
print elapsed 
35.929461956 

h5py kullanma:

t = time.time() 
sum(f["M"]["data"]) 
elapsed = time.time() - t 
print elapsed 

(ı bekleyen verdi ...)

[DÜZENLE]

Yorumları dayanarak

from scipy import sparse 
A = sparse.csc_matrix((f["M"]["data"], f["M"]["ir"], f["tfidf"]["jc"])) 

veya

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)) 
: @bpgergo, ben bir numpy dizi ya da aşağıdaki iki yolla bir scipy seyrek diziye h5py ( f) tarafından yüklenen neticenin denediğinizden eklemek gerekir

ancak bu işlemlerin ikisi de oldukça yavaştır.

Burada eksik olduğum bir şey var mı?

(yani o oluyor
import tables, warnings 
from scipy import sparse 

def load_sparse_matrix(fname) : 
    warnings.simplefilter("ignore", UserWarning) 
    f = tables.openFile(fname) 
    M = sparse.csc_matrix((f.root.M.data[...], f.root.M.ir[...], f.root.M.jc[...])) 
    f.close() 
    return M 

cevap

3

sorunun çoğu etkili bir bellek eşlemeli dizi olan şeye piton sum kullandığınız yani:

+0

Dosyayı yüklemek, Matlab'da (<1sn) neredeyse anlık olarak yapıldı, bu yüzden karşılaştırmanın adil olduğunu düşünüyorum, ancak yerleşik toplam işlevle ilgili noktanızı alıyorum. Ben daha fazla insan yapıyorum ne yapıyor olacağım (Matlab'dan Python'a taşınıyor) bu yüzden Matlab dosyalarında IMHO ... – tdc

+1

yükleme için biraz daha fazla destek olsaydı iyi olurdu. Dosyanız olmadan test edin, ancak aslında diziyi python'a yüklemek çok hızlı olmalıdır. Şu anda yapmakta olduğunuz şey aslında onu yüklemiyor. Etkin olarak bellek eşlemeli bir dizinin ne olduğunu yineler. Bağımsız olarak erişmek, çoğu diskte olduğu gibi herhangi bir dilde çok yavaş olacaktır. Yukarıdaki örnek kod hala yavaş mı? Ayrıca, ben değilim scipy.io.loadmat' http://docs.scipy.org/doc/scipy/reference/generated/scipy.io.loadmat.html#scipy.io.loadmat, bir göz var seyrek dizileri destekliyorsa emin olun. –

+0

henüz deneme şansı bulamadı ama giriş için teşekkürler – tdc

0
+0

Herhangi daha fazla ipucu? Eğer M = numpy.asarray (f ["M"] ["data"]) 'yaparsam, bu sonsuza dek sürecek gibi görünüyor ... – tdc

+0

@tdc, Kodunuzda' f' ne olduğunu bile bilmiyorum. Bu sayfaya danışmaya çalışın: http://docs.scipy.org/doc/scipy/reference/generated/scipy.io.loadmat.html. Bunu okuyabilsem de, hala v7.3 Matlab dosyalarını yüklemek için bir HDF5 python lib'e ihtiyacınız olacak. – bpgergo

+0

Ayrıca seyrek matrisler hakkında hiçbir şey yok – tdc

1

kuşaklar için son cevabın kaçırıyorsun diskte, bellekte değil).

Öncelikle, diskten bir şeyleri hafızada okumak için gereken süreyi okumak için gereken süreyi karşılaştırıyorsunuz. Matlab'da yaptığınız şeyle karşılaştırmak istiyorsanız, diziyi önce belleğe yükleyin.

İkinci olarak, pitonun yerleşik sum numpy dizileri için çok etkisizdir. (Ya da daha doğrusu, bir numpy dizisinin her öğesinde yinelenen çok yavaş, python'un sum yapısının ne olduğu çok yavaştır.) Sayısal diziler için numpy.sum(yourarray) veya yourarray.sum() kullanın. Örnek olarak

:

(. h5py kullanarak, onunla daha tanıdık olduğum için)

import h5py 
import numpy as np 

f = h5py.File('yourfile.hdf', 'r') 
dataset = f['/M/data'] 

# Load the entire array into memory, like you're doing for matlab... 
data = np.empty(dataset.shape, dataset.dtype) 
dataset.read_direct(data) 

print data.sum() #Or alternately, "np.sum(data)"