Поэлементная сила scipy.sparse матрицы - PullRequest
16 голосов
/ 22 июня 2011

Как мне повысить матрицу scipy.sparse до степени, поэлементно? numpy.power должен, согласно его руководству , сделать это, но это не сработает на разреженных матрицах:

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

Ответы [ 2 ]

11 голосов
/ 22 июня 2011

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

>>> 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
9 голосов
/ 09 апреля 2017

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

 X.power(2)
...