2010-03-03 14 views

उत्तर

7

मैं इसे स्वयं चाहता हूं और सच में अभी तक ऐसा करने के लिए एक शानदार अंतर्निहित तरीका नहीं है। इसे करने का एक तरीका यहां है। मैंने lil_matrix का उप-वर्ग बनाना चुना और remove_col फ़ंक्शन जोड़ दिया। यदि आप चाहते हैं, आप के बजाय removecol समारोह lil_matrix कक्षा में अपने lib/site-packages/scipy/sparse/lil.py फ़ाइल में जोड़ सकते हैं। कोड यह रहा:

from scipy import sparse 
from bisect import bisect_left 

class lil2(sparse.lil_matrix): 
    def removecol(self,j): 
     if j < 0: 
      j += self.shape[1] 

     if j < 0 or j >= self.shape[1]: 
      raise IndexError('column index out of bounds') 

     rows = self.rows 
     data = self.data 
     for i in xrange(self.shape[0]): 
      pos = bisect_left(rows[i], j) 
      if pos == len(rows[i]): 
       continue 
      elif rows[i][pos] == j: 
       rows[i].pop(pos) 
       data[i].pop(pos) 
       if pos == len(rows[i]): 
        continue 
      for pos2 in xrange(pos,len(rows[i])): 
       rows[i][pos2] -= 1 

     self._shape = (self._shape[0],self._shape[1]-1) 

मैं इसे बाहर की कोशिश की है और किसी भी कीड़े नहीं दिख रहा। मुझे निश्चित रूप से लगता है कि कॉलम को टुकड़ा करने से बेहतर है, जो अभी तक मुझे पता है कि एक नया मैट्रिक्स बनाता है।

मैंने एक रिमूवर समारोह भी करने का फैसला किया, लेकिन मुझे नहीं लगता कि यह हटाने के रूप में उतना ही अच्छा है। मैं जिस तरह से चाहता हूं उसमें एक अंडारे से एक पंक्ति को हटाने में सक्षम नहीं होने के कारण मैं सीमित हूं। यहां रीमूवरो है जिसे उपरोक्त वर्ग

def removerow(self,i): 
     if i < 0: 
      i += self.shape[0] 

     if i < 0 or i >= self.shape[0]: 
      raise IndexError('row index out of bounds') 

     self.rows = numpy.delete(self.rows,i,0) 
     self.data = numpy.delete(self.data,i,0) 
     self._shape = (self._shape[0]-1,self.shape[1]) 

शायद मुझे इन कार्यों को Scipy भंडार में सबमिट करना चाहिए।

0

def removecols(W, col_list): 
     if min(col_list) = W.shape[1]: 
       raise IndexError('column index out of bounds') 
     rows = W.rows 
     data = W.data 
     for i in xrange(M.shape[0]): 
      for j in col_list: 
       pos = bisect_left(rows[i], j) 
       if pos == len(rows[i]): 
         continue 
       elif rows[i][pos] == j: 
         rows[i].pop(pos) 
         data[i].pop(pos) 
         if pos == len(rows[i]): 
           continue 
       for pos2 in xrange(pos,len(rows[i])): 
         rows[i][pos2] -= 1 
     W._shape = (W._shape[0], W._shape[1]-len(col_list)) 
     return W 

इनपुट के रूप में col_list के साथ काम करने के लिए बस अपना कोड दोबारा लिखें - शायद यह किसी के लिए सहायक होगा।

+1

मुझे खुशी है कि कोई मेरे पहले प्रयास में सुधार करने की कोशिश कर रहा है। हालांकि, लाइन 'if min (col_list) = W.shape [1]: 'कई तरीकों से मुझे समझ में नहीं आता है। सबसे पहले, यह पाइथन में एक तर्क में असाइनमेंट का उपयोग करने के लिए अमान्य वाक्यविन्यास है। दूसरा, आप आकार के साथ col_list के मिनट की जांच क्यों कर रहे हैं? मैं सोच रहा हूं कि शायद आप 'अधिकतम (col_list)> = W.shape [1]: '? बेशक, इसका मतलब है कि आप नकारात्मक सूचकांक का भी उपयोग नहीं कर सकते हैं और 0 से नीचे सूचकांक के लिए कोई जांच नहीं है और उनके साथ क्या करना है। –

1

मैं पाइथन के लिए नया हूं इसलिए मेरा जवाब शायद गलत है, लेकिन मैं सोच रहा था कि निम्नलिखित में से कुछ क्यों कुशल नहीं होगा?

mat=hstack([ mat[:,0:i] , mat[:,i+1:] ]) 

अब मैट्रिक्स उसके बाद एक coo_matrix में बदल जाएगा लेकिन आप इसे lil_matrix को फिर से चालू कर सकते हैं:

कि आप i-वें स्तंभ निकालना चाहते हैं अपने lil_matrix चटाई कहा जाता है का कहना है और देता है।

ठीक है, मैं समझता हूं कि मैट वैरिएबल को असाइनमेंट करने से पहले इसे हस्टैक के अंदर दो मैट्रिक्स बनाना होगा, इसलिए यह मूल मैट्रिक्स प्लस एक ही समय में एक जैसा होगा लेकिन मुझे लगता है कि अगर विरलता पर्याप्त तो मुझे लगता है कि वहाँ किसी भी स्मृति समस्याओं नहीं होना चाहिए (क्योंकि स्मृति (और समय) विरल मैट्रिक्स का उपयोग कर के पूरे कारण है) बड़ा है।

+0

ऐसा लगता है कि कोई प्रश्न नहीं है। –

8

बहुत सरल है और तेजी से। तुम भी सीएसआर के लिए रूपांतरण की जरूरत नहीं है, लेकिन मैं सिर्फ यकीन है कि यह सीएसआर विरल मैट्रिक्स के साथ काम करता है और के बीच परिवर्तित एक मुद्दा नहीं होना चाहिए के लिए पता है।

from scipy import sparse 

x_new = sparse.lil_matrix(sparse.csr_matrix(x)[:,col_list]) 
+0

यह मेरे लिए काम नहीं करता है। – kevin

+2

कॉलम स्लाइसिंग के लिए आप सीएसआर (संपीड़ित स्पैस पंक्ति) मैट्रिक्स का उपयोग क्यों कर रहे हैं? सीएसआर प्रारूप के नुकसान में से एक है 'धीमी कॉलम स्लाइसिंग ऑपरेशंस (सीएससी पर विचार करें)' (एससीआई डॉक्स के अनुसार)। आपको, शायद, 'csc_matrix' रूपांतरण का उपयोग करना चाहिए। – silentser

1

एक विरल सीएसआर मैट्रिक्स (एक्स) और सूचकांक की सूची के लिए ड्रॉप करने (index_to_drop):

to_keep = list(set(xrange(X.shape[1]))-set(index_to_drop))  
new_X = X[:,to_keep] 

यह csr_matrices को lil_matrices कन्वर्ट करने के लिए आसान है। lil_matrix documentation

ध्यान दें कि tosil() का उपयोग कर सीएसआर से लिल मैट्रिस तक जाने के लिए महंगा है। इसलिए, यह विकल्प अच्छा है जब आपको अपने मैट्रिक्स को lil प्रारूप में रखने की आवश्यकता नहीं होती है।

0

हमारे मामले में, प्रत्येक विरल मैट्रिक्स के लिए नोट को देखकर विशेष रूप से करके सीएससी मैट्रिक्स है दस्तावेज़ में सूचीबद्ध के रूप में यह निम्न लाभ हैं [1]

  • कुशल अंकगणितीय आपरेशनों सीएससी + सीएससी, सीएससी * सीएससी, आदि ।
  • कुशल स्तंभ टुकड़ा करने की क्रिया
  • तेजी मैट्रिक्स वेक्टर उत्पादों (सीएसआर, बीएसआर तेजी से हो सकता है)

आप स्तंभ सूचकांक आप पानी है, तो हटाने के लिए, बस स्लाइसिंग का उपयोग करें। पंक्तियों को हटाने के लिए सीएसआर मैट्रिक्स का उपयोग करें क्योंकि यह पंक्ति स्लाइसिंग में कुशल है

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