【问题标题】:Creating Correlation Matrix-style table in Python在 Python 中创建相关矩阵样式表
【发布时间】:2016-08-14 20:59:46
【问题描述】:

我正在尝试为我的数据创建相关矩阵/列联表样式输出。我正在使用包含(不同数量)集群的重叠度量的字典。

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)还是用空格替换它们?

  • 这是否可能/可取作为打印输出?

我查看了在其他地方推荐的 PrettyTabletabulate,但也无法让它们发挥作用。我想我可以使用 Pandas 或其他一些统计模块,但这似乎有点矫枉过正,因为我想做的就是输出这些值。

编辑:这是我最终做的,其中“dict”是我的输入字典:

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)

【问题讨论】:

    标签: python output


    【解决方案1】:

    我对计算领域比较陌生,但我认为我有一个解决方案。如果这没有帮助或不方便,请告诉我原因(我还有很多东西要学)

    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:如果您需要进一步的解释,请随时询问。

    【讨论】:

    • 嗨,罗曼,谢谢,好东西!但是,当我的集群数量不均匀时,这确实对我不利,对吗?就像比较集合 1 中的三个集群和集合 2 中的两个集群一样?
    • 你是完全正确的我正在编辑我的答案来支持这个案例!
    • 如果您觉得我的回答有用,请考虑点赞
    • 嗨,罗曼,我最终只是在这个问题周围放置了一个“尝试”异常,以使其适用于奇数。感谢您的出色工作!
    • 实际上我已经修改了它,它应该适用于奇数?如果不是这种情况,您可以粘贴您的代码。所以我可以看到我错在哪里?谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    相关资源
    最近更新 更多