Посмотрите детали:
In [803]: m = sparse.csr_matrix(([1,1,1,3,2], ([1,2,2,3,4],[1,1,2,3,3])))
In [804]: m
Out[804]:
<5x4 sparse matrix of type '<class 'numpy.longlong'>'
with 5 stored elements in Compressed Sparse Row format>
In [805]: m.A
Out[805]:
array([[0, 0, 0, 0],
[0, 1, 0, 0],
[0, 1, 1, 0],
[0, 0, 0, 3],
[0, 0, 0, 2]], dtype=int64)
In [806]: m.sum(axis=1)
Out[806]:
matrix([[0],
[1],
[2],
[3],
[2]])
sum
на ndarray
уменьшает размеры (если не установлено keepdims
). Но sparse
копирует np.matrix
и сохраняет размеры. Таким образом, результатом является (5,1) матрица.
np.matrix
имеет сокращение для шага array/ravel
:
In [807]: m.sum(axis=1).A1
Out[807]: array([0, 1, 2, 3, 2])
И индексирование:
In [811]: m[m.sum(axis=1).A1>1,:]
Out[811]:
<3x4 sparse matrix of type '<class 'numpy.longlong'>'
with 4 stored elements in Compressed Sparse Row format>
In [812]: _.A
Out[812]:
array([[0, 1, 1, 0],
[0, 0, 0, 3],
[0, 0, 0, 2]], dtype=int64)
Я упоминал в другом месте, что csr
матричная индексация (обычно) использует «матрицу экстрактора» и умножение матриц. Это надежный и разумный способ хранения данных, но он не такой быстрый и мощный, как плотная индексация массива.
Иногда мы набираем скорость, воздействуя на базовые атрибуты матрицы, data
indices
и indptr
. Но это требует большего понимания этого представления, поэтому я не буду go вдаваться в детали.