Форматы csr
и csc
были разработаны для линейных алгебр, особенно для решения больших, но разреженных линейных уравнений
A*x = b
x = b/A
A
должны быть обратимыми и не могут иметьвсе строки 0 или столбцы.
A.sum(1)
выполняется с помощью умножения матриц, с (n, 1) массивом 1 с.
С вашим mat
:
In [203]: np.allclose(mat*np.mat(np.ones((120,1))), mat.sum(1))
Out[203]: True
Делая это самостоятельнона самом деле немного быстрее (где-то накладные расходы?)
In [204]: timeit mat.sum(1)
92.7 µs ± 111 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [205]: timeit mat*np.mat(np.ones((120,1)))
59.2 µs ± 53.1 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Я мог бы также сделать это с разреженной матрицей:
In [209]: mat*sparse.csc_matrix(np.ones((120,1)))
Out[209]:
<100x1 sparse matrix of type '<class 'numpy.float64'>'
with 100 stored elements in Compressed Sparse Column format>
In [211]: np.allclose(mat.sum(1),_.todense())
Out[211]: True
Но время медленнее, даже если я перемещаю разреженныесоздание вне цикла:
In [213]: %%timeit I=sparse.csc_matrix(np.ones((120,1)))
...: mat*I
...:
215 µs ± 401 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Если mat
было (115100,10)
с множеством всех 0 строк, то такой редкий подход мог бы дать экономию времени и пространства.
mat[:,:10]
также выполняется с умножением матрицы, с разреженной матрицей извлечения.
Это на самом деле медленнее, чем сумма строки:
In [247]: timeit mat[:,:10]
305 µs ± 10.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [248]: timeit mat[:,:10].sum(1)
384 µs ± 9.05 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Я могу объединить выбор столбца с суммой, используя:
In [252]: I = sparse.lil_matrix((120,1),dtype=int); I[:10,:]=1; I=I.tocsc()
In [253]: I
Out[253]:
<120x1 sparse matrix of type '<class 'numpy.int64'>'
with 10 stored elements in Compressed Sparse Column format>
In [254]: np.allclose((mat*I).todense(),mat[:,:10].sum(1))
Out[254]: True
Время на этом mat*I
медленнее, хотя я мог бы улучшить шаг строительства I
.
I = sparse.csc_matrix((np.ones(10,int), np.arange(10), np.array([0,10])), shape=(120,1))