2015-02-23 11 views
5

में डुप्लिकेट प्रविष्टियों को अनदेखा करते हुए मैंने और csr_matrix को (data, (rows, cols)) मानों की सूची से प्रलेखन के सुझावों के रूप में प्रारंभ करने का प्रयास किया है।स्पैर मैट्रिक्स

sparse = csc_matrix((data, (rows, cols)), shape=(n, n)) 

समस्या यह है कि, विधि है कि मैं वास्तव data, rows और cols वैक्टर पैदा करने के लिए है कुछ बातों के लिए डुप्लिकेट का परिचय है। डिफ़ॉल्ट रूप से, scipy डुप्लिकेट प्रविष्टियों के मान जोड़ता है। हालांकि, मेरे मामले में, उन डुप्लीकेटों के पास data में दिए गए (row, col) के लिए बिल्कुल वही मान है।

जो मैं प्राप्त करने की कोशिश कर रहा हूं वह दूसरी प्रविष्टि को अनदेखा करना है, यदि पहले से मौजूद है, तो उन्हें जोड़ने के बजाय।

इस तथ्य को अनदेखा करते हुए कि मैं डुप्लीकेट उत्पन्न करने से बचने के लिए पीढ़ी एल्गोरिदम में सुधार कर सकता हूं, क्या एक पैरामीटर या एक स्पैर मैट्रिक्स बनाने का दूसरा तरीका है जो डुप्लिकेट को अनदेखा करता है?

वर्तमान में data = [4, 4]; cols = [1, 1]; rows = [1, 1]; साथ दो प्रविष्टियों एक विरल मैट्रिक्स (1,1) पर जो मूल्य 8 है, जबकि वांछित मान 4 है उत्पन्न करते हैं।

>>> c = csc_matrix(([4, 4], ([1,1],[1,1])), shape=(3,3)) 
>>> c.todense() 
matrix([[0, 0, 0], 
     [0, 8, 0], 
     [0, 0, 0]]) 

मैं भी पता है कि मैं उन्हें एक 2-आयामी numpy unique फ़ंक्शन का उपयोग करके फ़िल्टर कर सकते हैं, लेकिन सूचियों काफी बड़ी तो यह वास्तव में एक मान्य विकल्प नहीं है।

प्रश्न के अन्य संभावित उत्तर: क्या डुप्लिकेट के साथ क्या करना है यह निर्दिष्ट करने का कोई तरीका है? यानी min या max को डिफ़ॉल्ट sum के बजाय रखते हुए?

+0

मुझे पूरा यकीन है कि उत्तर नहीं है, डुप्लिकेट के लिए व्यवहार को बदलने का कोई अंतर्निहित तरीका नहीं है। आपको 'np.unique' के उपयोग को हटाने पर बहुत तेज़ नहीं होना चाहिए, भले ही आपकी सूचियां कितनी बड़ी हों, भद्दा उन्हें अरणों में परिवर्तित करने जा रही है और हुड के नीचे समान ऑपरेशन कर रही है, इसलिए कोई कारण नहीं है कि आप कोशिश नहीं करनी चाहिए। – Jaime

+1

'np.unique' 1 डी है, इसलिए इन 2 डी निर्देशांकों को संभालने के लिए कुछ अतिरिक्त प्रयास की आवश्यकता होगी। – hpaulj

+1

यह सच है, लेकिन जैसे चाल [इस] (http://stackoverflow.com/questions/16970982/find-unique-rows-in-numpy-array) यह 2 डी बनाते हैं। –

उत्तर

4

एक मध्यस्थ dok मैट्रिक्स का निर्माण अपने उदाहरण में काम करता है:

In [410]: c=sparse.coo_matrix((data, (cols, rows)),shape=(3,3)).todok().tocsc() 

In [411]: c.A 
Out[411]: 
array([[0, 0, 0], 
     [0, 4, 0], 
     [0, 0, 0]], dtype=int32) 

एक coo मैट्रिक्स परिवर्तन के बिना अपने data, col, row विशेषताओं में अपने इनपुट सरणियों डालता है। संक्षेप तब तक नहीं होता जब तक कि इसे csc में परिवर्तित नहीं किया जाता है।

todok सीधे coo विशेषताओं से शब्दकोश को लोड करता है। यह खाली dok मैट्रिक्स बनाता है, और साथ में यह भर देता है:

dok.update(izip(izip(self.row,self.col),self.data)) 

तो अगर वहाँ डुप्लिकेट (row,col) मान होते हैं, यह पिछले एक है कि बनी हुई है। यह अनन्य कुंजी खोजने के लिए मानक पायथन शब्दकोश हैशिंग का उपयोग करता है।


यहां np.unique का उपयोग करने का एक तरीका है। मुझे एक विशेष ऑब्जेक्ट सरणी बनाना था, क्योंकि unique 1 डी पर चल रहा है, और हमारे पास 2 डी इंडेक्सिंग है।

In [479]: data, cols, rows = [np.array(j) for j in [[1,4,2,4,1],[0,1,1,1,2],[0,1,2,1,1]]] 

In [480]: x=np.zeros(cols.shape,dtype=object) 

In [481]: x[:]=list(zip(rows,cols)) 

In [482]: x 
Out[482]: array([(0, 0), (1, 1), (2, 1), (1, 1), (1, 2)], dtype=object) 

In [483]: i=np.unique(x,return_index=True)[1] 

In [484]: i 
Out[484]: array([0, 1, 4, 2], dtype=int32) 

In [485]: c1=sparse.csc_matrix((data[i],(cols[i],rows[i])),shape=(3,3)) 

In [486]: c1.A 
Out[486]: 
array([[1, 0, 0], 
     [0, 4, 2], 
     [0, 1, 0]], dtype=int32) 

मुझे नहीं पता कि कौन सा दृष्टिकोण तेज है।


अद्वितीय सूचकांक रही, प्रति liuengo's कड़ी के रूप में की एक वैकल्पिक तरीका:

rc = np.vstack([rows,cols]).T.copy() 
dt = rc.dtype.descr * 2 
i = np.unique(rc.view(dt), return_index=True)[1] 

rc आदेश को देखने के साथ dtype, इसलिए .T.copy() बदलने के लिए अपने स्वयं के डेटा के स्वामी की है।

In [554]: rc.view(dt) 
Out[554]: 
array([[(0, 0)], 
     [(1, 1)], 
     [(2, 1)], 
     [(1, 1)], 
     [(1, 2)]], 
     dtype=[('f0', '<i4'), ('f1', '<i4')]) 
+0

एक अच्छी चाल की तरह लग रहा है। मैं अभी यह कोशिश नहीं कर सकता, क्या इसमें प्रकारों के बीच रूपांतरण/समय लगता है? –

+0

todok() scipy 0.19 –

+0

पर डुप्लिकेट को अनदेखा नहीं करता है, 'coo.todok' में अब' self.sum_duplicates() 'पंक्ति शामिल है। समाधान जैसा कि मैंने वर्णन किया है, अद्यतन करना है, लेकिन इस 'sum' के बिना। – hpaulj

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