2011-12-01 12 views
5

की पंक्ति से एक स्पैर डायगोनल मैट्रिक्स बनाएं I Python/Scipy में बड़ी मैट्रिस को संसाधित करते हैं। मुझे बड़ी मैट्रिक्स से पंक्तियों को निकालने की आवश्यकता है (जो कोओ_मैट्रिक्स से भरा हुआ है) और उन्हें विकर्ण तत्वों के रूप में उपयोग करें। वर्तमान में मैं ऐसा निम्नलिखित फैशन में:एक स्पैर मैट्रिक्स

import numpy as np 
from scipy import sparse 

def computation(A): 
    for i in range(A.shape[0]): 
    diag_elems = np.array(A[i,:].todense()) 
    ith_diag = sparse.spdiags(diag_elems,0,A.shape[1],A.shape[1], format = "csc") 
    #... 

#create some random matrix 
A = (sparse.rand(1000,100000,0.02,format="csc")*5).astype(np.ubyte) 
#get timings 
profile.run('computation(A)') 

क्या मैं profile उत्पादन से देखते हैं कि समय के सबसे get_csr_submatrix समारोह द्वारा सेवन किया जाता है, जबकि diag_elems निकालने है। इससे मुझे लगता है कि मैं प्रारंभिक डेटा या एक स्पैर मैट्रिक्स से पंक्ति निकालने का गलत तरीका या तो अक्षम अक्षमता का उपयोग करता हूं। क्या आप एक स्पैर मैट्रिक्स से एक पंक्ति निकालने का एक बेहतर तरीका सुझा सकते हैं और इसे विकर्ण रूप में प्रस्तुत कर सकते हैं?

संपादित

निम्नलिखित संस्करण पंक्ति निकासी से टोंटी को हटा (सूचना है कि सरल csr करने के लिए 'csc' बदल रहा पर्याप्त नहीं है, A[i,:]A.getrow(i) के साथ प्रतिस्थापित किया जाना चाहिए और साथ ही)। हालांकि मुख्य सवाल यह है कि भौतिकरण (.todense()) को कैसे छोड़ें और पंक्ति के स्पैर प्रतिनिधित्व से विकर्ण मैट्रिक्स बनाएं।

import numpy as np 
from scipy import sparse 

def computation(A): 
    for i in range(A.shape[0]): 
    diag_elems = np.array(A.getrow(i).todense()) 
    ith_diag = sparse.spdiags(diag_elems,0,A.shape[1],A.shape[1], format = "csc") 
    #... 

#create some random matrix 
A = (sparse.rand(1000,100000,0.02,format="csr")*5).astype(np.ubyte) 
#get timings 
profile.run('computation(A)') 

अगर मैं सीधे 1 पंक्ति सीएसआर मैट्रिक्स से विकर्ण मैट्रिक्स बनाने के इस प्रकार है:

diag_elems = A.getrow(i) 
ith_diag = sparse.spdiags(diag_elems,0,A.shape[1],A.shape[1]) 

तो मैं न format="csc" तर्क निर्दिष्ट कर सकते हैं, और न ही सीएससी प्रारूप करने के लिए ith_diags कन्वर्ट:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.6/profile.py", line 70, in run 
    prof = prof.run(statement) 
    File "/usr/local/lib/python2.6/profile.py", line 456, in run 
    return self.runctx(cmd, dict, dict) 
    File "/usr/local/lib/python2.6/profile.py", line 462, in runctx 
    exec cmd in globals, locals 
    File "<string>", line 1, in <module> 
    File "<stdin>", line 4, in computation 
    File "/usr/local/lib/python2.6/site-packages/scipy/sparse/construct.py", line 56, in spdiags 
    return dia_matrix((data, diags), shape=(m,n)).asformat(format) 
    File "/usr/local/lib/python2.6/site-packages/scipy/sparse/base.py", line 211, in asformat 
    return getattr(self,'to' + format)() 
    File "/usr/local/lib/python2.6/site-packages/scipy/sparse/dia.py", line 173, in tocsc 
    return self.tocoo().tocsc() 
    File "/usr/local/lib/python2.6/site-packages/scipy/sparse/coo.py", line 263, in tocsc 
    data = np.empty(self.nnz, dtype=upcast(self.dtype)) 
    File "/usr/local/lib/python2.6/site-packages/scipy/sparse/sputils.py", line 47, in upcast 
    raise TypeError,'no supported conversion for types: %s' % args 
TypeError: no supported conversion for types: object` 
+1

क्या आपने इसके बजाय 'format =" csr "' कोशिश की? – cyborg

+0

प्रारंभिक डेटा के लिए 'सीएसआर' के साथ और 'ए [i,:] '' एग्रो (i)' के साथ प्रतिस्थापित किया गया, मैंने महत्वपूर्ण गति प्राप्त की। लेकिन जो मैं खोज रहा हूं वह है कि विकर्ण मैट्रिक्स की सृजन की शुरुआत की पंक्ति को भौतिक बनाना। कोई विचार? – savenkov

उत्तर

3

यहां मैं क्या आया:

def computation(A): 
    for i in range(A.shape[0]): 
     idx_begin = A.indptr[i] 
     idx_end = A.indptr[i+1] 
     row_nnz = idx_end - idx_begin 
     diag_elems = A.data[idx_begin:idx_end] 
     diag_indices = A.indices[idx_begin:idx_end] 
     ith_diag = sparse.csc_matrix((diag_elems, (diag_indices, diag_indices)),shape=(A.shape[1], A.shape[1])) 
     ith_diag.eliminate_zeros() 

पायथन प्रोफाइलर ने 1.464 सेकेंड बनाम 5.574 सेकेंड पहले कहा। यह अंतर्निहित घने सरणी (इंडिप्टर, सूचकांक, डेटा) का लाभ उठाता है जो स्पैर मैट्रिस को परिभाषित करता है। यहां मेरा क्रैश कोर्स है: एन्डिप्टर [i]: एन्प्ट्रर [i + 1] परिभाषित करता है कि घने सरणी में कौन से तत्व पंक्ति में शून्य-शून्य मानों से मेल खाते हैं I। A.data गैर-शून्य का घना 1 डी सरणी ए और एइंडिप्टर का मान है जहां वे मान जाते हैं।

मैं यह सुनिश्चित करने के लिए कुछ और परीक्षण करता हूं कि यह पहले जैसा ही है। मैंने केवल कुछ मामलों की जांच की।

+0

केविन, यह बहुत अच्छा है! – savenkov

+0

बीटीडब्ल्यू, row_nnz अप्रयुक्त है – savenkov

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