Учитывая квадратичную матрицу размерности 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))
У меня есть два вопроса:
- Есть ли более эффективный способ, я, возможно, упустил из виду?
- В то время как документы разреженного состояния scipy:
Все преобразования между форматами CSR, CSC и COO являются эффективными операциями с линейным временем.
Почему я получаю
SparseEfficiencyWarning: changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient.
при переходе с CSR на CSC?
csr_matrix
. Изменение структуры разреженности не имеет ничего общего с преобразованием между различными форматами разреженных матриц. Это когда вы добавляете плотный предмет(ы). - person Joe Kington   schedule 18.01.2012nonzero
выглядит многообещающе. - person Avaris   schedule 18.01.2012diag_deg, _ = np.histogram(x.nonzero()[0], np.arange(x.shape[0]+1))
- person Joe Kington   schedule 18.01.2012nonzero
. - person Joe Kington   schedule 18.01.2012