2011-06-21 3 views
14

Как поднять матрицу scipy.sparse по мощности, по элементам? numpy.power должен, согласно its manual, сделать это, но он не на разреженных матриц:Element-wise power of 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 

Та же проблема с X**2. Преобразование в плотный массив работает, но тратит драгоценные секунды.

У меня была та же проблема с np.multiply, которую я решил использовать методом разреженной матрицы multiply, но, похоже, нет метода pow.

+0

Я не достаточно знаком с numpy, чтобы сообщить вам ответ, но ваш код не противоречит документации. Второй аргумент numpy.power не должен быть числом, а другой матрицей. – RoundTower

+0

Похоже, что он вызывает метод '__pow__' объекта, который пытается скопировать всю матрицу, а не делать это по-разному. Это терпит неудачу, потому что, как говорится, матрица не квадратная. –

+0

@RoundTower: фактически, второй элемент должен быть массивом, который он не совпадает с матрицей в Numpy, но скаляр такой же, как и массив '(1,)' или '(1,1)' для цели 'numpy.power' на плотном массиве. –

ответ

9

Это немного низкого уровня, но для операций поэлементного вы можете работать с подстилающей массив данных непосредственно:

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

Я просто столкнулся с тем же вопросом и найти, что разреженная матрица поддерживает элемент -пороговая мощность. В приведенном выше случае это должно быть:

X.power(2) 
+0

Это для python 2.7? –