2011-12-06 8 views
5

पर ऑपरेटिंग मै मैटलैब से आने वाले अजगर के लिए नया हूं। मेरे पास matlab v7.3 (HDF5) प्रारूप में सहेजा गया एक बड़ा स्पैस मैट्रिक्स है। मैंने अब तक h5py और tables का उपयोग करके फ़ाइल में लोड करने के दो तरीके पाए हैं। हालांकि मैट्रिक्स पर काम करना या तो बहुत धीमा प्रतीत होता है।लोडिंग मैटलैब स्पैर मैट्रिक्स -व 7.3 (एचडीएफ 5) के साथ पाइथन में सहेजा गया और

>> whos  
    Name   Size     Bytes Class  Attributes 

    M  11337x133338   77124408 double sparse  

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

का उपयोग करते हुए टेबल: उदाहरण के लिए, matlab में

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

h5py का उपयोग करना:

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

(मैं इंतज़ार कर छोड़ दिया ...)

[संपादित करें]

टिप्पणियों के आधार पर @bpgergo से, मैं जोड़ने चाहिए कि मैं एक numpy सरणी या निम्न दो तरह से एक scipy विरल सरणी में परिणाम h5py (f) द्वारा में लोड परिवर्तित करने की कोशिश की है:

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

या

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)) 

लेकिन इन दोनों परिचालनों में भी बहुत धीमी गति से हैं।

क्या मुझे कुछ याद आ रही है?

उत्तर

3

आपकी समस्या के अधिकांश है कि तुम क्या प्रभावी रूप से एक स्मृति-मैप की सरणी है पर अजगर sum का उपयोग कर रहे है (यानी यह है डिस्क पर, स्मृति में नहीं)।

सबसे पहले, आप स्मृति से चीजों को पढ़ने के लिए डिस्क से चीजों को पढ़ने के लिए लगने वाले समय की तुलना कर रहे हैं। मैटलैब में जो भी कर रहे हैं उससे तुलना करना चाहते हैं, तो पहले सरणी को मेमोरी में लोड करें।

दूसरा, पायथन का बिल्टिन sum numpy arrays के लिए बहुत अक्षम है। (या, बल्कि, एक numpy सरणी के प्रत्येक आइटम के माध्यम से स्वतंत्र रूप से बहुत धीमी है, जो कि पाइथन का बिल्टिन sum कर रहा है।) numpy.sum(yourarray) या yourarray.sum() का उपयोग numpy arrays के लिए करें।

एक उदाहरण के रूप:

(। h5py का उपयोग करना, क्योंकि मैं इसे से परिचित हूँ)

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)" 
+0

फ़ाइल लोड हो रहा है Matlab (<1sec) में लगभग तात्कालिक था इसलिए मुझे लगता है कि तुलना निष्पक्ष थी, लेकिन मैं अंतर्निहित योग समारोह के बारे में अपना मुद्दा लेता हूं। मुझे लगता है कि मैं जितना कर रहा हूं उतना अधिक लोग कर रहे हैं (मैटलैब से पायथन तक जा रहे हैं) तो मैटलैब फाइलों में लोड होने के लिए थोड़ा और समर्थन होने पर यह अच्छा होगा ... – tdc

+1

ठीक है, मैं नहीं कर सकता अपनी फ़ाइल के बिना इसे परीक्षण करें, लेकिन वास्तव में अजगर में सरणी लोड करना बहुत तेज़ होना चाहिए। जो आप वर्तमान में कर रहे हैं वह वास्तव में इसे लोड नहीं कर रहा है। यह प्रभावी ढंग से स्मृति-मैप किए गए सरणी को प्रभावी बनाता है। इसे किसी भी भाषा में स्वतंत्र रूप से एक्सेस करना बहुत धीमा होगा, क्योंकि यह ज्यादातर डिस्क चाहता है। क्या उपर्युक्त उदाहरण कोड अभी भी धीमा है? साथ ही, 'scipy.io.loadmat' http://docs.scipy.org/doc/scipy/reference/generated/scipy.io.loadmat.html#scipy.io.loadmat पर एक नज़र डालें, हालांकि मैं नहीं हूं सुनिश्चित करें कि यह स्पैर सरणी का समर्थन करता है। –

+0

को अभी तक कोशिश करने का मौका नहीं मिला लेकिन इनपुट के लिए धन्यवाद – tdc

0

आप numpy भूल रहे हैं http://www.scipy.org/NumPy_for_Matlab_Users

+0

कोई और सुराग? अगर मैं 'एम = numpy.asarray (एफ [" एम "] [" डेटा "] करता हूं) 'यह हमेशा के लिए लगता है ... – tdc

+0

@tdc, मुझे यह भी नहीं पता कि आपके कोड में' f' क्या है। इस पृष्ठ से परामर्श करने का प्रयास करें: http://docs.scipy.org/doc/scipy/reference/generated/scipy.io.loadmat.html। हालांकि मैंने इसे पढ़ा है, फिर भी आपको v7.3 Matlab फ़ाइलों को लोड करने के लिए एक HDF5 पायथन lib की आवश्यकता होगी। – bpgergo

+0

स्पैर मैट्रिस – tdc

1

भावी पीढ़ी के लिए अंतिम जवाब:

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 
संबंधित मुद्दे