की पंक्ति से एक स्पैर डायगोनल मैट्रिक्स बनाएं 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`
क्या आपने इसके बजाय 'format =" csr "' कोशिश की? – cyborg
प्रारंभिक डेटा के लिए 'सीएसआर' के साथ और 'ए [i,:] '' एग्रो (i)' के साथ प्रतिस्थापित किया गया, मैंने महत्वपूर्ण गति प्राप्त की। लेकिन जो मैं खोज रहा हूं वह है कि विकर्ण मैट्रिक्स की सृजन की शुरुआत की पंक्ति को भौतिक बनाना। कोई विचार? – savenkov