包含最大值的字典

时间:2013-08-07 17:04:07

标签: python dictionary scipy sparse-matrix

我有这个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 个答案:

答案 0 :(得分: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:] ] ) )

你的最终功能可能是:

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