функции numpy, которые можно / нельзя использовать в матрице сжатых разреженных строк (CSR) - PullRequest
0 голосов
/ 05 марта 2019

Я новичок в Python, и у меня есть (возможно, очень наивный) вопрос.У меня есть матрица CSR (сжатый разреженный ряд) для работы (назовем ее M), и я похож на некоторые функции, которые предназначены для работы с 2d-массивом с использованием массива для моей матрицы, в то время как некоторые другие этого не делают.

Например, numpy.sum(M, axis=0) работает нормально, в то время как numpy.diagonal(M) выдает ошибку, говорящую о {ValueError}diag requires an array of at least two dimensions.

Так есть ли обоснование, почему одна матричная функция работает на M, а другая - нет?

И бонусный вопрос, как получить диагональные элементы из матрицы CSR, учитывая, что выше numpy.diagonal не работает для него?

1 Ответ

1 голос
/ 05 марта 2019

Код для np.diagonal:

return asanyarray(a).diagonal(offset=offset, axis1=axis1, axis2=axis2)

То есть сначала он пытается преобразовать аргумент в массив, например, если это список списков. Но это не правильный способ превратить разреженную матрицу в ndarray.

In [33]: from scipy import sparse                                               
In [34]: M = sparse.csr_matrix(np.eye(3))                                       
In [35]: M                                                                      
Out[35]: 
<3x3 sparse matrix of type '<class 'numpy.float64'>'
    with 3 stored elements in Compressed Sparse Row format>
In [36]: M.A                                  # right                                  
Out[36]: 
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
In [37]: np.asanyarray(M)                    # wrong                           
Out[37]: 
array(<3x3 sparse matrix of type '<class 'numpy.float64'>'
    with 3 stored elements in Compressed Sparse Row format>, dtype=object)

Правильный способ использования np.diagonal:

In [38]: np.diagonal(M.A)                                                       
Out[38]: array([1., 1., 1.])

Но в этом нет необходимости. M уже имеет diagonal метод:

In [39]: M.diagonal()                                                           
Out[39]: array([1., 1., 1.])

np.sum работает, потому что делегирует действие методу (посмотрите на его код):

In [40]: M.sum(axis=0)                                                          
Out[40]: matrix([[1., 1., 1.]])
In [41]: np.sum(M, axis=0)                                                      
Out[41]: matrix([[1., 1., 1.]])

Как правило, старайтесь использовать sparse функции и методы на разреженных матрицах. Не рассчитывайте на numpy функции для правильной работы. sparse построен на numpy, но numpy не «знает» о sparse.

...