2011-06-21 9 views
14

¿Cómo elevo una matriz scipy.sparse a una potencia, elemento-sabio? numpy.power debe, según its manual, hacer esto, pero falla en matrices dispersas:Potencia de elemento de scipy.sparse matriz

>>> 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 

mismo problema con X**2. La conversión a una matriz densa funciona, pero desperdicia preciosos segundos.

Tuve el mismo problema con np.multiply, que resolví con el método multiply de la matriz dispersa, pero parece que no hay un método pow.

+0

No estoy lo suficientemente familiarizado con numpy para decirle la respuesta, pero su código no contradice la documentación. El segundo argumento para numpy.power no debe ser un número, sino otra matriz. – RoundTower

+0

Parece que está llamando al método '__pow__' del objeto, que intenta cuadrar toda la matriz, en lugar de hacerlo en forma de elemento. Eso falla porque, como dice, la matriz no es cuadrada. –

+0

@RoundTower: en realidad, el segundo elemento debe ser una matriz, que no es lo mismo que una matriz en Numpy, pero un escalar es lo mismo que una matriz '(1,)' o '(1,1)' para el propósitos de 'numpy.power' en una matriz densa. –

Respuesta

9

Esto es un poco de bajo nivel, pero para las operaciones elemento a elemento que puede trabajar con la matriz de datos subyacente directamente:

>>> 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

Me acabo de encontrar con la misma pregunta y encontrar que matriz dispersa ahora es compatible con el elemento - poder de la derecha. Para el caso anterior, debería ser:

X.power(2) 
+0

¿Es esto para Python 2.7? –

Cuestiones relacionadas