Деление разреженной матрицы
У меня есть матрица scipy.sparse с 45671x45671 элементами. В этой матрице некоторые строки содержат только значение "0".
У меня вопрос, как разделить значения каждой строки на сумму строки. Очевидно, что с циклом for это работает, но я ищу эффективный метод...
Я уже попробовал:
matrix / matrix.sum(1)
но у меня естьMemoryError
вопрос.matrix / scs.csc_matrix((matrix.sum(axis=1)))
ноValueError: inconsistent shapes
- Другие дурацкие вещи...
Более того, я хочу пропустить строки только со значениями "0".
Итак, если у вас есть решение...
Заранее спасибо!
1 ответ
У меня есть M
торчать вокруг:
In [241]: M
Out[241]:
<6x3 sparse matrix of type '<class 'numpy.uint8'>'
with 6 stored elements in Compressed Sparse Row format>
In [242]: M.A
Out[242]:
array([[1, 0, 0],
[0, 1, 0],
[0, 0, 1],
[0, 1, 0],
[0, 0, 1],
[1, 0, 0]], dtype=uint8)
In [243]: M.sum(1) # dense matrix
Out[243]:
matrix([[1],
[1],
[1],
[1],
[1],
[1]], dtype=uint32)
In [244]: M/M.sum(1) # dense matrix - full size of M
Out[244]:
matrix([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.],
[ 0., 1., 0.],
[ 0., 0., 1.],
[ 1., 0., 0.]])
Это объяснит ошибку памяти - если M
настолько велика, что M.A
выдает ошибку памяти.
In [262]: S = sparse.csr_matrix(M.sum(1))
In [263]: S.shape
Out[263]: (6, 1)
In [264]: M.shape
Out[264]: (6, 3)
In [265]: M/S
....
ValueError: inconsistent shapes
Я не совсем уверен, что здесь происходит.
Элемент умного умножения работает
In [266]: M.multiply(S)
Out[266]:
<6x3 sparse matrix of type '<class 'numpy.uint32'>'
with 6 stored elements in Compressed Sparse Row format>
Так что должно сработать, если я построю S
как S = sparse.csr_matrix(1/M.sum(1))
Если некоторые строки суммируют до нуля, у вас есть проблема деления на ноль.
Если я изменю M
иметь 0 ряд
In [283]: M.A
Out[283]:
array([[1, 0, 0],
[0, 1, 0],
[0, 0, 0],
[0, 1, 0],
[0, 0, 1],
[1, 0, 0]], dtype=uint8)
In [284]: S = sparse.csr_matrix(1/M.sum(1))
/usr/local/bin/ipython3:1: RuntimeWarning: divide by zero encountered in true_divide
#!/usr/bin/python3
In [285]: S.A
Out[285]:
array([[ 1.],
[ 1.],
[ inf],
[ 1.],
[ 1.],
[ 1.]])
In [286]: M.multiply(S)
Out[286]:
<6x3 sparse matrix of type '<class 'numpy.float64'>'
with 5 stored elements in Compressed Sparse Row format>
In [287]: _.A
Out[287]:
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.],
[ 1., 0., 0.]])
Это не самый лучший M
чтобы продемонстрировать это, но это предлагает полезный подход. Сумма строки будет плотной, так что вы можете очистить ее инверсию, используя обычные подходы плотных массивов.