सीएससी प्रारूप सभी गैर-शून्य प्रविष्टियों के पंक्ति सूचकांक की एक सूची रखता है, सीएसआर प्रारूप सभी गैर-शून्य प्रविष्टियों के कॉलम इंडेक्स की एक सूची रखता है। मुझे लगता है कि आपको लगता है कि का लाभ लेने के चारों ओर बातें स्वैप करने के लिए इस प्रकार कर सकते हैं और मुझे लगता है कि यह करने के लिए कोई दुष्प्रभाव नहीं होना चाहिए:
def swap_rows(mat, a, b) :
mat_csc = scipy.sparse.csc_matrix(mat)
a_idx = np.where(mat_csc.indices == a)
b_idx = np.where(mat_csc.indices == b)
mat_csc.indices[a_idx] = b
mat_csc.indices[b_idx] = a
return mat_csc.asformat(mat.format)
def swap_cols(mat, a, b) :
mat_csr = scipy.sparse.csr_matrix(mat)
a_idx = np.where(mat_csr.indices == a)
b_idx = np.where(mat_csr.indices == b)
mat_csr.indices[a_idx] = b
mat_csr.indices[b_idx] = a
return mat_csr.asformat(mat.format)
अब आप कुछ इस तरह कर सकता है:
>>> mat = np.zeros((5,5))
>>> mat[[1, 2, 3, 3], [0, 2, 2, 4]] = 1
>>> mat = scipy.sparse.lil_matrix(mat)
>>> mat.todense()
matrix([[ 0., 0., 0., 0., 0.],
[ 1., 0., 0., 0., 0.],
[ 0., 0., 1., 0., 0.],
[ 0., 0., 1., 0., 1.],
[ 0., 0., 0., 0., 0.]])
>>> swap_rows(mat, 1, 3)
<5x5 sparse matrix of type '<type 'numpy.float64'>'
with 4 stored elements in LInked List format>
>>> swap_rows(mat, 1, 3).todense()
matrix([[ 0., 0., 0., 0., 0.],
[ 0., 0., 1., 0., 1.],
[ 0., 0., 1., 0., 0.],
[ 1., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]])
>>> swap_cols(mat, 0, 4)
<5x5 sparse matrix of type '<type 'numpy.float64'>'
with 4 stored elements in LInked List format>
>>> swap_cols(mat, 0, 4).todense()
matrix([[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 1.],
[ 0., 0., 1., 0., 0.],
[ 1., 0., 1., 0., 0.],
[ 0., 0., 0., 0., 0.]])
मैंने यह दिखाने के लिए एक एलआईएल मैट्रिक्स का उपयोग किया है कि आप अपने आउटपुट के प्रकार को कैसे सुरक्षित रख सकते हैं। आपके आवेदन में आप शायद पहले से ही सीएससी या सीएसआर प्रारूप में रहना चाहते हैं, और रूपांतरणों को कम करने के लिए पहले इसके आधार पर पंक्तियों या स्तंभों को स्वैप करना है या नहीं।
मुझे इसे किसी विशेष कार्यान्वयन के लिए चाहिए। हालांकि, जैसा कि एक सहयोगी ने मुझे बताया, आम तौर पर, कोई स्पैर मैट्रिक्स पर क्रमपरिवर्तन नहीं करेगा। एक स्पैर मैट्रिक्स 'ए' आमतौर पर रैखिक मानचित्र' y = एक्स 'के रूप में प्रयोग किया जाता है, उदा। पुनरावृत्त हलकों में। इस प्रकार इस स्वैपिंग को 'ए' के चारों ओर एक रैपर लिखकर बेहतर महसूस किया जाता है, इनपुट वेक्टर एक्स की प्रविष्टियों को स्वैप किया जाता है (यह 'ए' में कॉलम स्वैपिंग है) या 'y' की प्रविष्टियां (यह पंक्ति स्वैपिंग है)। – Jan