2012-06-20 9 views
1

에하지 유사성 행렬에서 가장 높은 값을 찾기 나는 similarity matrix 다음 말해봐 : 대각선에 값이 모두 100.0 상부 삼각형이 아래 삼각형에 같 동일하다고대각선

matrix = [[100.0, 66.666666666666671, 61.539999999999999, 59.260000000000005, 59.260000000000005, 82.61333333333333, 61.539999999999999, 61.539999999999999, 61.539999999999999, 78.259999999999991], 
[66.666666666666671, 100.0, 91.306666666666672, 87.5, 87.5, 69.233333333333334, 91.306666666666672, 91.306666666666672, 91.306666666666672, 65.386666666666656], 
[61.539999999999999, 91.306666666666672, 100.0, 88.0, 88.0, 70.373333333333335, 91.666666666666671, 91.666666666666671, 100.0, 66.666666666666671], 
[59.260000000000005, 87.5, 88.0, 100.0, 84.620000000000005, 74.079999999999998, 95.833333333333329, 95.833333333333329, 88.0, 64.286666666666662], 
[59.260000000000005, 87.5, 88.0, 84.620000000000005, 100.0, 67.859999999999999, 88.0, 88.0, 88.0, 64.286666666666662], 
[82.61333333333333, 69.233333333333334, 70.373333333333335, 74.079999999999998, 67.859999999999999, 100.0, 76.926666666666662, 76.926666666666662, 76.926666666666662, 87.5], 
[61.539999999999999, 91.306666666666672, 91.666666666666671, 95.833333333333329, 88.0, 76.926666666666662, 100.0, 100.0, 91.666666666666671, 66.666666666666671], 
[61.539999999999999, 91.306666666666672, 91.666666666666671, 95.833333333333329, 88.0, 76.926666666666662, 100.0, 100.0, 91.666666666666671, 66.666666666666671], 
[61.539999999999999, 91.306666666666672, 100.0, 88.0, 88.0, 76.926666666666662, 91.666666666666671, 91.666666666666671, 100.0, 66.666666666666671], 
[78.259999999999991, 65.386666666666656, 66.666666666666671, 64.286666666666662, 64.286666666666662, 87.5, 66.666666666666671, 66.666666666666671, 66.666666666666671, 100.0]] 

참고.

대각선이 아닌 5 개의 다른 가장 높은 값의 색인을 찾고 싶습니다.

from collections import defaultdict 
d = defaultdict(list) 
for i in range(len(matrix)): 
    for j in range(len(matrix[i])): 
     d[matrix[i][j]].append((i,j)) 

for value in sorted(d.keys(), reverse=True)[1:6]: 
    print value, d[value] 

제공 :

95.8333333333 [(3, 6), (3, 7), (6, 3), (7, 3)] 
91.6666666667 [(2, 6), (2, 7), (6, 2), (6, 8), (7, 2), (7, 8), (8, 6), (8, 7)] 
91.3066666667 [(1, 2), (1, 6), (1, 7), (1, 8), (2, 1), (6, 1), (7, 1), (8, 1)] 
88.0 [(2, 3), (2, 4), (3, 2), (3, 8), (4, 2), (4, 6), (4, 7), (4, 8), (6, 4), (7, 4), (8, 3), (8, 4)] 
87.5 [(1, 3), (1, 4), (3, 1), (4, 1), (5, 9), (9, 5)] 

을하지만 절반을 통과 할 필요는 동안 전체 매트릭스를 통과하기 때문에이 비효율적이다 나는이 무력 방법을 순간

매트릭스 : 가장 높은 값을 위해 95.8333333333 나는 인덱스 (3,6)(3,7) 만 신경 쓰고 있습니다.

아마도 numpy를 사용하여보다 효율적인 방법이 있습니까?

+0

대각선에없는 요소가 100.0 개 있습니다. –

+0

@Antii Haapala Gooed catch! 나는 그것들을 원한다. – BioGeek

답변

1
from heapq import nlargest 
from collections import defaultdict 

d = defaultdict(list) 

for i in xrange(len(matrix)): 
    for j in xrange(i): 
     d[matrix[i][j]].append((i, j)) 

for value, positions in nlargest(5, d.items(), key=lambda item: item[0]): 
    print value, positions 
  • 사용 xrange - 1 (ⅰ = 0, 그 내부 루프가 실행되지 않을 경우 ...) 효율적인 용
  • 사용하려면 목록을 정렬하지 말고 heapq 에서 nlargest를 사용하십시오.이 경우 힙 데이터 구조가 사용됩니다. 큰 매트릭스의 경우 중요합니다.
1

Numpy가 빠릅니다. 난에

  • 루프 J 만 대신 범위

    import numpy as np 
    
    m = np.array(matrix) * np.diag(len(matrix)) # set the upper triangle to zero 
    for top_value in sorted((np.unique(m)), reverse=True)[1:6]: 
        print top_value, zip(*np.where(m == top_value))