2011-06-21 16 views
14

Jak podnieść macierz scipy.sparse do mocy, elementowo? numpy.power powinny, według its manual to zrobić, ale to nie na macierzach rzadkich:Elementarna moc scipy.sparse matrix

>>> X 
<1353x32100 sparse matrix of type '<type 'numpy.float64'>' 
     with 144875 stored elements in Compressed Sparse Row format> 

>>> np.power(X, 2) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File ".../scipy/sparse/base.py", line 347, in __pow__ 
    raise TypeError('matrix is not square') 
TypeError: matrix is not square 

sam problem z X**2. Konwersja na gęstą szyk działa, ale marnuje cenne sekundy.

Miałem ten sam problem z np.multiply, który rozwiązałem przy użyciu metody rzadkiej macierzy multiply, ale wydaje się, że nie ma metody pow.

+0

Nie jestem wystarczająco zaznajomiony z numpy, aby powiedzieć ci odpowiedź, ale twój kod nie jest sprzeczny z dokumentacją. Drugi argument do numpy.power nie powinien być liczbą, ale inną macierzą. – RoundTower

+0

Wygląda na to, że wywołuje metodę obiektu "__pow__", która próbuje wyrównać całą macierz, zamiast wykonywać ją w sposób elementowy. To się nie udaje, ponieważ, jak to się mówi, macierz nie jest kwadratowa. –

+0

@RoundTower: właściwie, drugi element powinien być tablicą, która nie jest taka sama jak macierz w Numpy, ale skalar jest taki sam jak tablica '(1,)' lub '(1,1)' dla w celach 'numpy.power' na gęstej tablicy. –

Odpowiedz

9

To jest trochę na niskim poziomie, ale dla operacji element mądry można pracować z bazowym tablicy danych bezpośrednio:

>>> import scipy.sparse 
>>> X = scipy.sparse.rand(1000,1000, density=0.003) 
>>> X = scipy.sparse.csr_matrix(X) 
>>> Y = X.copy() 
>>> Y.data **= 3 
>>> 
>>> abs((X.toarray()**3-Y.toarray())).max() 
0.0 
4

po prostu wpadł na to samo pytanie i stwierdzić, że rzadki matryca obsługuje elementu -przeciętna moc. W powyższym przypadku powinno być:

X.power(2) 
+0

Czy to jest dla Pythona 2.7? –