2013-08-07 3 views
1

У меня есть этот SciPy csr_matrix:словари, содержащие самые большие значения

(0, 12114) 0.272571581001 
    (0, 12001) 0.0598986479579 
    (0, 11998) 0.137415042369 
    (0, 11132) 0.0681428952502 
    (0, 10412) 0.0681428952502 
    (1, 10096) 0.0990242494495 
    (1, 10085) 0.216197045661 
    (1, 9105) 0.1362857905 
    (1, 8925) 0.042670696769 
    (1, 8660) 0.0598986479579 
    (2, 6577) 0.119797295916 
    (2, 6491) 0.0985172979468 
    (3, 6178) 0.1362857905 
    (3, 5286) 0.119797295916 
    (3, 5147) 0.270246307076 
    (3, 4466) 0.0540492614153 
    (4, 3810) 0.0540492614153 
    (4, 3773) 0.0495121247248 

, и я хотел бы найти способ, чтобы создать (в данном случае 4) словарей, где каждый словарь содержит 2 большие значения для каждой строки. .

Так, например, для строки 0 мой словарь будет:

dict0 = {12114: '0.27257158100111998', 11998: '0.137415042369'} 

и для ряда 1:

dict1 = {10085: '0.216197045661', 9105: '0.1362857905'} 

ответ

1

Поскольку csr_matrix не имеет метод sort(), удобно преобразовать строку, которую нужно массив первого:

a = m[i,:].toarray().flatten() 

Чтобы получить позиции отсортированных столбцов:

argsa = a.argsort() 

Наибольшие значения приведены на последних столбцах argsa, поэтому для получения столбцов двух самых больших значений:

argsa[-2:] 

Чтобы получить пару column, value:

argsa[-2:], a[ argsa[-2:] ] 

И это может быть трансформирована в Словаре:

dict(zip(argsa[-2:], a[ argsa[-2:] ])) 

Ваша последняя функция может быть STH как:

def get_from_m(m, i, numc=2): 
    a = m[i,:].toarray().flatten() 
    argsa = a.argsort() 
    return dict(zip(argsa[-numc:], a[ argsa[-numc:] ])) 
+0

От взглядов его массива, вероятно, значительно быстрее, чтобы просто прокручивать индексы вместо формирования плотного массива. – Daniel

+0

Если вы видите последнее редактирование, вы на самом деле просто преобразуете в массив строки, которые хотите ... –

Смежные вопросы