2015-07-02 7 views
5

मेरे पास एक स्पैर मैट्रिक्स है जो sklearn tfidfVectorier से बदल दिया गया है। मेरा मानना ​​है कि कुछ पंक्तियां सभी शून्य पंक्तियां हैं। मैं उन्हें हटाना चाहता हूं। हालांकि, जहां तक ​​मुझे पता है, मौजूदा अंतर्निहित फ़ंक्शंस, उदा। nonzero() और elim_zero(), पंक्तियों की बजाय शून्य प्रविष्टियों पर ध्यान केंद्रित करें।scipy sparse matrix: उन पंक्तियों को हटाएं जिनके सभी तत्व शून्य हैं

क्या एक स्पैर मैट्रिक्स से सभी शून्य पंक्तियों को हटाने का कोई आसान तरीका है?

उदाहरण: क्या मैं अब (वास्तव में विरल प्रारूप में) है:

[ [0, 0, 0] 
    [1, 0, 2] 
    [0, 0, 1] ] 

क्या मैं प्राप्त करना चाहते हैं: इस के लिए

[ [1, 0, 2] 
    [0, 0, 1] ] 

उत्तर

2

मौजूदा नहीं कर रहे हैं काम करता है, लेकिन यह नहीं है अपना खुद का लिखना बहुत बुरा:

def remove_zero_rows(M): 
    M = scipy.sparse.csr_matrix(M) 

सबसे पहले, मैट्रिक्स कोमें परिवर्तित करेंप्रारूप। यह महत्वपूर्ण है क्योंकि सीएसआर मैट्रिस (data, indices, indptr) के ट्रिपल के रूप में अपने डेटा को स्टोर करते हैं, जहां data में गैर-शून्य मान, indices स्टोर कॉलम इंडेक्स रखता है, और indptr पंक्ति सूचकांक जानकारी रखता है।

पंक्ति के लिए स्तंभ सूचकांक मैं indices[indptr[i]:indptr[i+1]] में जमा हो जाती उनके संबंधित मान data[indptr[i]:indptr[i+1]] में जमा हो जाती है: डॉक्स बेहतर समझाने।

तो, किसी भी nonzero मूल्यों के बिना पंक्तियों को खोजने के लिए, हम केवल M.indptr के लगातार मूल्यों को देख सकते हैं। ऊपर से हमारे समारोह को जारी रखते हुए:

num_nonzeros = np.diff(M.indptr) 
    return M[num_nonzeros != 0] 

सीएसआर प्रारूप यहाँ के दूसरे लाभ यह है कि यह पंक्तियाँ काट करने के लिए है, जो परिणामस्वरूप मैट्रिक्स के निर्माण को सरल अपेक्षाकृत सस्ती है।

1

आपके उत्तर के लिए धन्यवाद,

@perimosocordiae मैं सिर्फ अपने आप को द्वारा एक और समाधान खोजने के। यदि भविष्य में किसी को इसकी आवश्यकता हो तो मैं यहां पोस्ट कर रहा हूं।

M = M[M.getnnz(1)>0] 

वर्क्स सीधे csr_array पर:

def remove_zero_rows(X) 
    # X is a scipy sparse matrix. We want to remove all zero rows from it 
    nonzero_row_indice, _ = X.nonzero() 
    unique_nonzero_indice = numpy.unique(nonzero_row_indice) 
    return X[unique_nonzero_indice] 
5

स्लाइसिंग + getnnz() काम कर देता है।

M = M[:,M.getnnz(0)>0] 

आप निकालना दोनों की जरूरत

M = M[M.getnnz(1)>0][:,M.getnnz(0)>0] #GOOD 

मैं क्यों, लेकिन

M = M[M.getnnz(1)>0, M.getnnz(0)>0] #BAD 

नहीं है यकीन नहीं है चाहते हैं, तो फिर भी: तुम भी सभी 0 कॉलम बदलकर प्रारूपों के बिना हटा सकते हैं काम।

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