Код для 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
.