2012-01-17 9 views
9

pytables का उपयोग करते समय, scipy.sparse मैट्रिक्स प्रारूपों के लिए कोई समर्थन नहीं है (जहां तक ​​मैं बता सकता हूं), इसलिए मैट्रिक्स को स्टोर करने के लिए मुझे कुछ रूपांतरण करना है, उदा।pytables का उपयोग करना, जो अधिक कुशल है: scipy.sparse या numpy घने मैट्रिक्स?

def store_sparse_matrix(self): 
    grp1 = self.getFileHandle().createGroup(self.getGroup(), 'M') 
    self.getFileHandle().createArray(grp1, 'data', M.tocsr().data) 
    self.getFileHandle().createArray(grp1, 'indptr', M.tocsr().indptr) 
    self.getFileHandle().createArray(grp1, 'indices', M.tocsr().indices) 

def get_sparse_matrix(self): 
    return sparse.csr_matrix((self.getGroup().M.data, self.getGroup().M.indices, self.getGroup().M.indptr)) 

मुसीबत get_sparse समारोह कुछ समय (डिस्क से पढ़ने) लेता है, और अगर मैं समझता हूँ कि इसे सही ढंग से भी स्मृति में फिट करने के लिए डेटा की आवश्यकता है कि है।

एकमात्र अन्य विकल्प मैट्रिक्स को घने प्रारूप (numpy array) में परिवर्तित करने लगता है और फिर pytables सामान्य रूप से उपयोग करता है। हालांकि यह अपेक्षाकृत अक्षम है, हालांकि मुझे लगता है कि शायद pytables संपीड़न से निपटेंगे?

+0

एक नियमित NumPy सरणी का उपयोग निश्चित रूप से स्मृति में फिट करने के लिए शून्य सहित समस्त मैट्रिक्स की आवश्यकता होगी। आप अपने एल्गोरिदम में स्पष्टीकरण का भी फायदा नहीं उठा पाएंगे। लेकिन आपका सवाल वास्तव में क्या है? –

+1

@ लार्समैन लेकिन जब pytables के साथ संयोजन में NumPy सरणी का उपयोग करते हैं, तो मेरी समझ यह है कि यह आवश्यक होने पर केवल डिस्क से लोड होता है, और इसलिए पूरे मैट्रिक्स को स्मृति में फिट नहीं होना चाहिए। हालांकि यह आवश्यक है कि ज़ीरो समेत संपूर्ण मैट्रिक्स डिस्क पर संग्रहीत है (और इसलिए आवश्यक होने पर भी डिस्क पर पढ़ें/लिखा गया है)। ऐसा लगता है कि इससे अनावश्यक ओवरहेड बन जाएगा, जब वास्तव में केवल कुछ मूल्यों को पढ़ने की आवश्यकता हो सकती है। हालांकि scipy.sparse के लिए देशी समर्थन के बिना मैं यह नहीं देख सकता कि इससे कैसे बचें? – tdc

+2

तो सवाल यह है, "क्या यह मांग सीएसआर मैट्रिक्स को लोड करेगा?" मैं इसका उत्तर नहीं दे सकता क्योंकि मुझे PyTables नहीं पता है। मुझे पता है कि आप mmap'd arrays द्वारा समर्थित सीएसआर मैट्रिक्स बना सकते हैं ... –

उत्तर

2

Storing numpy sparse matrix in HDF5 (PyTables) से उधार, आप एक scipy.sparse सरणी एक pytables प्रारूप में अपनी data, indicies, और indptr गुण है, जो तीन नियमित numpy.ndarray वस्तुओं रहे हैं का उपयोग कर मार्शल कर सकते हैं।

+1

इस दृष्टिकोण के साथ समस्या यह है कि आपको पूरी चीज को उस पर scipy मैट्रिक्स ऑपरेशंस का उपयोग करने के लिए deserialize करना होगा, या अपने खुद के बराबर लिखना होगा कि pytables में डेटा आइटम पर काम करते हैं। – tdc

+1

आपके द्वारा लिंक किए गए प्रश्न पर [मेरा उत्तर] (http://stackoverflow.com/a/22589030/2858145) भी देखें ... आपको 'आकार' विशेषता को भी स्टोर करना होगा। –

संबंधित मुद्दे