2015-03-20 10 views
5

jestem konstruowaniu rzadki wektor uzywajac scipy.sparse.csr_matrix tak:tajemnicze scipy „nie można przekonwertować całkowitą skalarne” błąd

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

Działa to dobrze dla większości moich danych, ale od czasu do czasu dostaję ValueError: could not convert integer scalar.

ten powtarza się problem:

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 jest np.int64 Array vals jest np.float64 tablicy.

Istotna część kodu scipy sum_duplicates to here.

Zauważ, że to działa:

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> 

więc problemem nie jest to, że jeden z wymiarów jest > 2^31

wszelkie myśli, dlaczego te wartości powinny być przyczyną problemu?

+0

proszę spróbować użyć '2 ** 31' i' 2 ** 31-1' z tym samym przykładem, który wysłałeś. – matiasg

+0

tak, przykładowe dane Zamieściłem prace z '2 ** 31-1' ale nie 2 ** 31 – Rok

Odpowiedz

1

Może się okazać, że MAX_INDEX> 2 ** 31? Spróbuj to, by upewnić się:

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

+0

tak, to była moja pierwsza myśl, jak również - ale to działa z innymi podobnymi danymi przy użyciu tego samego' max_index' – Rok

+0

nie, 'scipy.sparse.csr_matrix' działa dobrze z' MAX_INDEX> 2 ** 31' - patrz edytowanego pytanie. – Rok

+0

@Rok I rzeczywiście dostać inny wyjątek (używając Python 2.7 + scipy 0.9.0). Mogę skonstruować macierz za pomocą '2 ** 31-1', ale nie za pomocą' 2 ** 31'. Jakiej wersji scipy używasz? – matiasg

0

Indeks max dajesz jest mniejsza niż maksymalna indeksu wierszy jesteś zasilających.

Ten sparse.csr_matrix((vals, (np.zeros(10), inds)), shape = (1, np.max(inds)+1)) działa dobrze ze mną.

Chociaż wytwarzania .todense() prowadzi do błędów pamięci o dużej wielkości matrycy

+0

dobrze, nie - maksymalna wartość indeksu w tablicy jest 2101454109, ale 'max_index' jest 2337713001. Gdy wymiar jest zbyt mała, to rzuca' ValueError: indeks kolumny przekracza błąd dimensions' macierzy. Chociaż masz rację, że działa 'inds.max() + 1'. Fabuła gęstnieje. – Rok

+0

Ups, policzyłem zero mniej. BTW, dla mnie wszystko większe niż 2 ** 32-1 nie działa (Twój przykład nie działa).Rzuca dziwny wyjątek, NotImplementedError: Zła liczba lub typ argumentów dla przeciążonej funkcji "coo_tocsr". Korzystam z entuzjastycznej dystrybucji studentów, wersja scipy: '0.13.3' – Ars3nous

+0

Domyślam się, że twoja wersja używa 32-bitowych liczb całkowitych? – Rok

0

odkomentowanie sum_duplicates - funkcja będzie prowadzić do innych błędów. Ale ta poprawka: strange error when creating csr_matrix rozwiązuje również twój problem. Możesz rozszerzyć version_check na nowsze wersje 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 
Powiązane problemy