Учитывая квадратичную матрицу размером 1 млн., Я хочу рассчитать матрицу диагональной степени.Как вычислить матрицу диагональной степени от огромной матрицы (scipy.sparse)?
Матрица диагональной степени определяется как диагональная матрица, в которой есть количество ненулевых значений для каждой строки.
Матрица, назовем ее 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))
У меня два вопроса:
- Есть ли более эффективный способ, я, возможно, упустили из виду?
- Хотя docs of scipy sparse state:
All conversions among the CSR, CSC, and COO formats are efficient, linear-time operations.
Почему я получаю
SparseEfficiencyWarning: changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient.
в то время как переход от КСО CSC?
Вы получаете сообщение об ошибке при установке элемента в 'csr_matrix'. «Изменение структуры разреженности» не имеет ничего общего с преобразованием между различными разреженными матричными форматами. Это когда вы добавляете «плотный» предмет (ы). –
Если все, что вам нужно сделать, это подсчет ненулевых элементов, ['nonzero'] (http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.csr_matrix.nonzero.html#scipy .sparse.csr_matrix.nonzero) выглядит многообещающим. – Avaris
Как уже указывал @avaris, вы можете просто сделать diag_deg, _ = np.histogram (x.nonzero() [0], np.arange (x.shape [0] +1)) ' –