2016-04-21 85 views
0

我正在嘗試爲我的數據創建相關矩陣/應變表樣式輸出。我正在處理包含(不同數量)羣集重疊度量的字典。在Python中創建相關矩陣樣式表

overlap={(0,0): 0.5, (1,0):0.2, (1,1):0.0} 

重疊BTW集羣「0」,「0」爲0.5,等 現在我想這個輸出是這樣的:

0  1 
0 0.5  0.2 

1 0.2  0 

我認爲這將是很容易,但我完全停留在這一點上。 這是我迄今爲止所做的:我得到了我的行和列。

t=overlap.items() 
column_names=[i[0][0] for i in t] 
rows=[[i[0][1], i[1]] for i in t] 

我做一個字符串模板,以填補這些值:

template="{}\t"*len(column_names) 

然後我嘗試寫出列名和遍歷行,以填補這一點。這就是當我卡住:

print template.format(??) 
for row in rows: 
    print template.format(??) 

我不知道該怎麼

  • 獲取format接受列表(其中任何一列或行)一塊一塊的項目? (特別是因爲我每次都沒有相同數量的簇)!

  • 此外,我將不得不填寫重複值(1-2 vs 2-1)或將它們替換爲空格?

  • 這甚至可能/建議作爲打印輸出嗎?

我看着PrettyTable和在別處建議tabulate但不能讓那些來工作的。我想我可以使用熊貓或其他統計模塊,但它似乎有點矯枉過正,因爲我只想輸出這些值。

編輯:這是我落得這樣做,這裏的「字典」是我輸入字典:

entries=dict.items() 
column_names=list(set([i[0][0] for i in entries])) 
row_names=list(set([i[0][1] for i in entries])) 
coltemplate="\t{:<25}"*len(column_names) 
print "{:25}".format(" "), coltemplate.format(*column_names) 
for r in row_names: 
    result=[] 
     for c in column_names: 
      if c == r: 
       result.append("***") 
      elif dict.get((c,r), None) == None: 
       result.append(dict.get((r,c), "***")) 
      else: 
       result.append(dict.get((c,r), "SERIOUS ERROR")) 
result=[str(i) for i in result] 
rowtemplate="\t{:25}"*len(result) 
print "{:>25}".format(r), rowtemplate.format(*result) 

回答

1

我relativly新的計算領域,但我想我有一個解決方案。如果這並不幫助或不conveniant請告訴我爲什麼(我有很多東西需要學習)

overlap={(0,0): 0.5, (1,0):0.2, (1,1):0.0, (2,1):0.3, (2,0):0.4} 
t=overlap.items() 

liste_columns = list(set([i[0][0] for i in t])) # get the columns name 
liste_columns = [str(element) for element in liste_columns] 

liste_rows = list(set([i[0][0] for i in t])) # get the rows name 
liste_rows = [str(element) for element in liste_rows] 

header = '\t' + str('\t'.join(liste_columns)) # header column name 
print(header) 
for row in liste_rows: 
    print(row, end='\t') # row name 
    for columns in liste_columns: 
     key = (int(columns),int(row)) # key for accessing valu in dict 
     if key in overlap: 
      value = overlap[key] 
     else: 
      value = overlap[key[::-1]] #reverse the tuple 
     print(value, end= '\t') 
    print('') 

看到逆轉的元組

How to reverse tuples in Python? 輸出

0 1 2 
0 0.5 0.2 0.4 
1 0.2 0.0 0.3 

希望這有助於

ps:如果您需要進一步解釋請隨時詢問。

+0

嗨羅曼,謝謝,好東西!然而,當我有不平衡數量的簇時,這確實會打破我的觀點,對嗎?如同比較集合1中的三個集合與集合2中的兩個集羣? – patrick

+0

你是完全正確的我編輯我的答案來支持這種情況! –

+1

請考慮upvote,如果你發現我的答案有用 –