2015-03-20 6 views
5

मैं एक विरल वेक्टर एक scipy.sparse.csr_matrix इसलिए की तरह का उपयोग कर निर्माण कर रहा हूँ:गुप्त scipy "पूर्णांक अदिश परिवर्तित नहीं सका" त्रुटि

csr_matrix((values, (np.zeros(len(indices)), indices)), shape = (1, max_index)) 

यह मेरा डेटा के अधिकांश के लिए ठीक काम करता है, लेकिन कभी कभी मैं एक ValueError: could not convert integer scalar मिलता है।

यह समस्या reproduces:

In [145]: inds 

Out[145]: 
array([ 827969148, 996833913, 1968345558, 898183169, 1811744124, 
     2101454109, 133039182, 898183170, 919293479, 133039089]) 

In [146]: vals 

Out[146]: 
array([ 1., 1., 1., 1., 1., 2., 1., 1., 1., 1.]) 

In [147]: max_index 

Out[147]: 
2337713000 

In [143]: csr_matrix((vals, (np.zeros(10), inds)), shape = (1, max_index+1)) 
... 

    996   fn = _sparsetools.csr_sum_duplicates 
    997   M,N = self._swap(self.shape) 
--> 998   fn(M, N, self.indptr, self.indices, self.data) 
    999 
    1000   self.prune() # nnz may have changed 

ValueError: could not convert integer scalar 

inds एक np.int64 सरणी है और vals एक np.float64 सरणी है।

scipy sum_duplicates कोड का प्रासंगिक भाग here है।

ध्यान दें कि यह काम करता है:

In [235]: csr_matrix(([1,1], ([0,0], [1,2])), shape = (1, 2**34)) 
Out[235]: 

<1x17179869184 sparse matrix of type '<type 'numpy.int64'>' 
    with 2 stored elements in Compressed Sparse Row format> 

तो समस्या नहीं है आयामों की है कि एक > 2^31

किसी भी विचार यही वजह है कि इन मूल्यों से समस्या हो रही किया जाना चाहिए?

+0

कृपया उसी उदाहरण के साथ '2 ** 31' और' 2 ** 31-1' का उपयोग करने का प्रयास करें। – matiasg

+0

हां, मैंने पोस्ट किया गया नमूना डेटा '2 ** 31-1' के साथ काम करता है लेकिन 2 ** 31 – Rok

उत्तर

1

क्या यह max_index> 2 ** 31 हो सकता है? यह सिर्फ यकीन है कि बनाने की कोशिश करें,:

csr_matrix((vals, (np.zeros(10), inds/2)), shape = (1, max_index/2))

+0

हां नहीं, यह मेरा पहला विचार भी था - लेकिन यह वही' max_index' – Rok

+0

का उपयोग करके अन्य समान डेटा के साथ काम करता है नहीं, 'scipy.sparse.csr_matrix'' max_index> 2 ** 31' के साथ ठीक काम करता है - संपादित प्रश्न देखें। – Rok

+0

@ रोक मुझे वास्तव में एक अलग अपवाद मिलता है (पायथन 2.7 + scipy 0.9.0 का उपयोग करके)। मैं '2 ** 31-1' के साथ मैट्रिक्स का निर्माण कर सकता हूं लेकिन' 2 ** 31' के साथ नहीं। आप किस स्पीसी संस्करण का उपयोग कर रहे हैं? – matiasg

0

अधिकतम सूचकांक आप दे रहे हैं आप जिन पंक्तियों को आपूर्ति कर रहे हैं की अधिकतम सूचकांक की तुलना में कम है।

यह sparse.csr_matrix((vals, (np.zeros(10), inds)), shape = (1, np.max(inds)+1)) मेरे साथ ठीक काम करता है।

एक .todense() मैट्रिक्स

+0

अच्छी तरह से, नहीं - इंडेक्स सरणी में अधिकतम मान 210145410 9 है लेकिन 'max_index' 2337713001 है। जब आयाम बहुत छोटा होता है, तो यह 'ValueError: कॉलम अनुक्रमणिका मैट्रिक्स आयामों से अधिक है' त्रुटि फेंकता है। यद्यपि आप सही हैं कि 'inds.max() + 1' कामों का उपयोग करना। साज़िश का गहरा जाना। – Rok

+0

ओह, मैंने शून्य कम गिना। बीटीडब्ल्यू, मेरे लिए 2 से अधिक ** ** 32-1 काम नहीं करता है (आपका उदाहरण विफल रहता है)।यह एक अजीब अपवाद फेंकता है, NotImplementedError: ओवरलोडेड फ़ंक्शन 'coo_tocsr' के लिए गलत संख्या या तर्कों का प्रकार। मैं उत्साहित छात्र वितरण, scipy संस्करण का उपयोग कर रहा हूँ: '0.13.3' – Ars3nous

+0

मुझे लगता है कि आपका संस्करण 32-बिट पूर्णांक का उपयोग कर रहा है? – Rok

0

sum_duplicates uncommenting के बड़े आकार के लिए स्मृति त्रुटि में परिणाम बनाने हालांकि - समारोह अन्य त्रुटियों को बढ़ावा मिलेगा। लेकिन यह फिक्स: strange error when creating csr_matrix आपकी समस्या हल करता है। आप संस्करण_चेक को scipy के नए संस्करणों में बढ़ा सकते हैं।

import scipy 
import scipy.sparse 
if scipy.__version__ in ("0.14.0", "0.14.1", "0.15.1"): 
    _get_index_dtype = scipy.sparse.sputils.get_index_dtype 
    def _my_get_index_dtype(*a, **kw): 
     kw.pop('check_contents', None) 
     return _get_index_dtype(*a, **kw) 
    scipy.sparse.compressed.get_index_dtype = _my_get_index_dtype 
    scipy.sparse.csr.get_index_dtype = _my_get_index_dtype 
    scipy.sparse.bsr.get_index_dtype = _my_get_index_dtype 
संबंधित मुद्दे