2011-06-03 13 views
5

मैं एक एल्गोरिदम पर काम कर रहा हूं जो विकर्ण और पहले के विकर्ण ब्लॉक का उपयोग करता है (ई06 x ई06) ब्लॉक विकर्ण स्पैस मैट्रिक्स होगा।scipy sparse matrix पर व्यू/पायथन संदर्भ कैसे बनाएं?

अभी मैं एक ऐसा नियम बनाता हूं जो ब्लॉक को इस तरह से स्टोर करता है कि मैं फैशन जैसे मैट्रिक्स में ब्लॉक तक पहुंच सकता हूं। उदाहरण के लिए बी [0,0] (5x5) 5x5 ब्लॉक मानते हुए मैट्रिक्स A (20x20) का पहला ब्लॉक देता है और मैट्रिक्स Asparse.lil प्रकार का है।

यह ठीक काम करता है लेकिन बहुत लंबे समय तक चलता है। यह अक्षम है क्योंकि यह डेटा की प्रतिलिपि बनाता है, क्योंकि इस संदर्भ में मेरी आश्चर्य के बारे में पता चला है: GetItem Method

क्या एक नियम में एक स्पैर मैट्रिक्स पर केवल एक दृश्य को स्टोर करने का कोई तरीका है? मैं सामग्री को बदलना चाहता हूं और फिर भी वही पहचानकर्ताओं का उपयोग करने में सक्षम हूं। यह ठीक है अगर इसमें थोड़ी देर लगती है क्योंकि इसे केवल एक बार किया जाना चाहिए। ब्लॉक में कई अलग-अलग आयाम और आकार होंगे।

उत्तर

4

जहां तक ​​मुझे पता है, scipy.sparse में विभिन्न स्पैर मैट्रिक्स की तरह कुछ प्रकार के दृश्य की बजाय प्रतियां प्रतियां। (कुछ अन्य lil_matrix से ऐसा करने में काफी तेजी से हो सकते हैं!)

जो भी आप चाहते हैं वह करने का एक तरीका स्लाइस ऑब्जेक्ट्स के साथ काम करना है। उदाहरण के लिए:

import scipy.sparse 

class SparseBlocks(object): 
    def __init__(self, data, chunksize=5): 
     self.data = data 
     self.chunksize = chunksize 
    def _convert_slices(self, slices): 
     newslices = [] 
     for axslice in slices: 
      if isinstance(axslice, slice): 
       start, stop = axslice.start, axslice.stop 
       if axslice.start is not None: 
        start *= self.chunksize 
       if axslice.stop is not None: 
        stop *= self.chunksize 
       axslice = slice(start, stop, None) 
      elif axslice is not None: 
       axslice = slice(axslice, axslice+self.chunksize) 
      newslices.append(axslice) 
     return tuple(newslices) 

    def __getitem__(self, item): 
     item = self._convert_slices(item) 
     return self.data.__getitem__(item) 
    def __setitem__(self, item, value): 
     item = self._convert_slices(item) 
     return self.data.__setitem__(item, value) 

data = scipy.sparse.lil_matrix((20,20)) 
s = SparseBlocks(data) 
s[0,0] = 1 
print s.data 

अब, जब भी हम संशोधित s[whatever] यह उचित हिस्सा के s.data को संशोधित करेगा। दूसरे शब्दों में, s[0,0] वापस आएगा या s.data[:5, :5] सेट करेगा, और इसी तरह।

+1

अच्छा, मुझे जिस चीज़ की आवश्यकता है, वैसे ही दिखता है, जवाब देने में देरी के लिए खेद है, मैं एक मैट्रिक्स के लिए अलग-अलग आकार के एकाधिक ब्लॉक स्वीकार करने के लिए कोड को संशोधित करने का प्रयास कर रहा हूं। अभी तक मेरी मदद मत करो, मैं इसे अपने आप से समझना चाहता हूं :)। अगर मैं और समस्याओं में भाग लेता हूं तो मैं वापस आऊंगा। धन्यवाद – Jonas

+0

ध्यान दें कि संस्करण 0.11.0 के बाद, SciPy में एक (ब्लॉक विकर्ण कार्य) है [docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.block_diag.html#scipy.sparse.block_diag] जो दिखता है यहां सहायक होने के लिए। – drevicko