Учитывая квадратичную матрицу размером 1 миллион, я хочу вычислить матрицу диагональных градусов.
Матрица диагональных градусов определяется как диагональная матрица, в которой в качестве записей указано количество ненулевых значений на строку.
Матрица, назовем ее A
в формате scipy.sparse.csr_matrix
.
Если бы у моей машины было достаточно мощности, я бы просто сделал
diagonal_degrees = []
for row in A:
diagonal_degrees.append(numpy.sum(row!=0))
Я даже пробовал это, но это приводит к
ValueError: array is too big.
Поэтому я попытался использовать разреженную структуру scipy. Я думал об этом так:
diagonal_degrees = []
CSC_format = A.tocsc() # A is in scipys CSR format.
for i in range(CSC_format.shape[0]):
row = CSC_format.getrow(i)
diagonal_degrees.append(numpy.sum(row!=0))
У меня есть два вопроса:
- Есть ли более эффективный способ, возможно, я упустил из виду?
- Пока документы о скудном разреженном состоянии :
Все преобразования между форматами CSR, CSC и COO являются эффективными операциями с линейным временем.
Почему я получаю
SparseEfficiencyWarning: changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient.
при переходе с CSR на CSC?