Получить топ-n элементов каждой строки в скудной разреженной матрице
Прочитав этот похожий вопрос, я все еще не могу полностью понять, как реализовать решение, которое я ищу. У меня разреженная матрица, т.е.
import numpy as np
from scipy import sparse
arr = np.array([[0,5,3,0,2],[6,0,4,9,0],[0,0,0,6,8]])
arr_csc = sparse.csc_matrix(arr)
Я хотел бы эффективно получить верхние n элементов каждой строки, не преобразовывая разреженную матрицу в плотную. Конечный результат должен выглядеть следующим образом (при условии n=2):
top_n_arr = np.array([[0,5,3,0,0],[6,0,0,9,0],[0,0,0,6,8]])
top_n_arr_csc = sparse.csc_matrix(top_n_arr)
1 ответ
Что не так с связанным ответом? Разве это не работает в вашем случае? или ты просто этого не понимаешь? Или это недостаточно эффективно?
Я собирался предложить выработать способ поиска верхних значений для ряда lil
отформатировать матрицу и применить эту строку за строкой. Но я бы просто повторил свой предыдущий ответ.
Хорошо, мой предыдущий ответ был для начала, но не хватало некоторых деталей для итерации lol
формат. Вот начало; это, вероятно, можно очистить.
Сделайте массив и lil
версия:
In [42]: arr = np.array([[0,5,3,0,2],[6,0,4,9,0],[0,0,0,6,8]])
In [43]: arr_sp=sparse.csc_matrix(arr)
In [44]: arr_ll=arr_sp.tolil()
Функция строки из предыдущего ответа:
def max_n(row_data, row_indices, n):
i = row_data.argsort()[-n:]
# i = row_data.argpartition(-n)[-n:]
top_values = row_data[i]
top_indices = row_indices[i] # do the sparse indices matter?
return top_values, top_indices, i
Перебирать строки arr_ll
, примените эту функцию и замените элементы:
In [46]: for i in range(arr_ll.shape[0]):
d,r=max_n(np.array(arr_ll.data[i]),np.array(arr_ll.rows[i]),2)[:2]
arr_ll.data[i]=d.tolist()
arr_ll.rows[i]=r.tolist()
....:
In [47]: arr_ll.data
Out[47]: array([[3, 5], [6, 9], [6, 8]], dtype=object)
In [48]: arr_ll.rows
Out[48]: array([[2, 1], [0, 3], [3, 4]], dtype=object)
In [49]: arr_ll.tocsc().A
Out[49]:
array([[0, 5, 3, 0, 0],
[6, 0, 0, 9, 0],
[0, 0, 0, 6, 8]])
в lil
В этом формате данные хранятся в двух массивах типов объектов в виде подсписков: один с номерами данных, другой с индексами столбцов.
Просмотр атрибутов данных разреженной матрицы удобен при выполнении новых задач. Изменение этих атрибутов сопряжено с определенным риском, поскольку портит весь массив. Но похоже, что lil
формат может быть настроен так безопасно.
csr
формат лучше для доступа к строкам, чем csc
, Это данные хранятся в 3 массивах, data
, indices
а также indptr
, lil
формат эффективно разбивает 2 из этих массивов на подсписки на основе информации в indptr
, csr
отлично подходит для математики (умножение, сложение и т. д.), но не так хорош при изменении разреженности (превращение ненулевых значений в нули).