У меня есть две scipy разреженные матрицы csr с одинаковой формой, но потенциально разные значения данных и значение nnz. Теперь я хочу получить 10 лучших элементов одной матрицы и увеличить значение на тех же показателях на другой матрице. Мой текущий подход заключается в следующем:Показатели scipy sparse csr_matrix
idx = a.data.argpartition(-10)[-10:]
i, j = matrix.nonzero()
i_idx = i[idx]
j_idx = j[idx]
b[i_idx, j_idx] += 1
Причина, почему я должен идти по этому пути является то, что a.data и b.data не обязательно иметь одинаковое число элементов и, следовательно, показатели будут отличаться.
Вопрос теперь в том, смогу ли я каким-то образом улучшить это. Насколько я знаю, ненулевая процедура не изящна, поскольку мне приходится выделять два новых массива, и я уже очень жестко отношусь к памяти. Я могу получить j_indices через csr_matrix.indices, но как насчет i_indices? Могу ли я использовать indptr для этого?
Счастливые для любых намеков.
'indptr' имеет одно значение для каждой строки (плюс 1). Он указывает, где каждая строка начинается в массивах 'data' и' index '. Вы можете выполнить математику, или вы можете преобразовать массив 'tocoo()'. Тогда 'row' и' col' имеют значения, которые вы хотите. Но будьте осторожны, есть некоторые предупреждения о том, что индексы не могут быть отсортированы. – hpaulj
Посмотрите на код для 'nonzero'. Если преобразование матрицы в 'coo' и возвращает' row' и 'col'. – hpaulj
«Первые 10 элементов» означают первые 10 ненулевых значений в формате CSR? –