【问题标题】:pairwise combinations to matrix/table representation矩阵/表格表示的成对组合
【发布时间】:2020-02-14 16:12:05
【问题描述】:

我认为这可能是人们已经解决的问题,甚至可能是我缺少的一些功能,所以我想在重新发明轮子之前先问一下。

基本上,鉴于itertools.combinations 的一些成对输出,我想将其表示为每个比较的矩阵/表格。

到目前为止,我大致做到了这一点:

from itertools import combinations

def chunks(l, n):
    n = max(1, n)
    return [l[i:i+n] for i in range(0, len(l), n)]
    
x = [("A", 1), ("B", 2), ("C", 3), ("D", 4), ("E", 5)]

[print(i) for i in chunks([i[1]+j[1] for i, j in combinations(x, 2)], len(x)-1)]

这给了我一个矩阵式的输出:

[3, 4, 5, 6]
[5, 6, 7, 7]
[8, 9]
[None, None, None]

我还不确定Nones 来自哪里,因为chunks([i[1]+j[1] for i, j in combinations(x, 2)], len(x)-1) 的输出是:

[[3, 4, 5, 6], [5, 6, 7, 7], [8, 9]]

但我可以稍后再调查(但请随时指出我明显的错误!)

理想情况下,我希望得到一个成对矩阵(理想情况下,还要附上比较的名称,所以它看起来像:

    A    B    C    D    E
A        3    4    5    6
B             5    6    7
C                  7    8
D                       9
E   

很明显,我对输入数据长度的chunking 的幼稚方法也不太正确,因为属于C+D7 比较在错误的行上。我忘记解释每次消失的额外条目。

如果有更好的方法,我很乐意改变方法。我一直专注于为此使用itertools,因为它最终可能会在大文件上运行,并且可能在更大的脚本中进行数千次比较,并发生其他计算等,因此避免自我和重复比较是理想的。

编辑:

补充一点,我希望随后能够将我描述的矩阵以及行名和列名输出到 tsv/csv 或类似文件。

【问题讨论】:

    标签: python matrix combinations itertools


    【解决方案1】:

    这将创建一个您所描述的矩阵,使用 0 表示“空白”:

    [[(a[1]+b[1] if a[0]<b[0] else 0) for b in x] for a in x]
    

    打印出来:

    print("\t".join(['']+[a[0] for a in x]))
    for a in x:
        print("\t".join([a[0]] + [(str(a[1]+b[1]) if a[0]<b[0] else '') for b in x]))
    

    【讨论】:

    • 对不起,我想我不清楚输出。将其转换为矩阵形式很棒,但我希望能够将此矩阵放入 tsv 或 csv 等,并带有列/行标题。我将编辑我的问题。
    猜你喜欢
    • 2017-05-03
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    相关资源
    最近更新 更多