2016-04-21 2 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 против 2-1) или заменить их пробелом?

  • Возможно ли это в качестве выхода для печати?

Я смотрел на PrettyTable и tabulate, которые были рекомендованы в другом месте, но не могли получить те работать либо. Думаю, я мог бы использовать Pandas или какой-либо другой модуль статистики, но это кажется немного излишним, поскольку все, что я хочу сделать, это вывести эти значения.

Edit: Вот то, что я в конечном итоге делает, где «ДИКТ» мой вход словарь:

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

Привет, Romain, спасибо, хорошие вещи! Однако, это разрывает меня, когда у меня есть нечетное количество кластеров, правильно? Как сравнение трех кластеров от набора 1 до двух кластеров из набора 2? – patrick

+0

Вы полностью правы Я редактирую свой ответ, чтобы поддержать этот случай! –

+1

, пожалуйста, учтите, что если вы найдете мой ответ полезным –

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