【问题标题】:Python - Convert a matrix to edge list/long formPython - 将矩阵转换为边列表/长格式
【发布时间】:2013-06-14 00:42:08
【问题描述】:

我有一个非常大的 csv 文件,其矩阵如下:

null,A,B,C

A,0,2,3

B,3,4,2

C,1,2,4

它始终是一个 n*n 矩阵。第一列和第一行是名称。我想将其转换为 3 列格式(也可以称为边缘列表、长格式等),如下所示:

A,A,0

A,B,2

A,C,3

B,A,3

B,B,4

B,C,2

C,A,1

C,B,2

C,C,4

我用过:

row = 0
for line in fin:
    line = line.strip("\n")
    col = 0
    tokens = line.split(",")
    for t in tokens:
        fout.write("\n%s,%s,%s"%(row,col,t))
        col += 1
    row += 1

没用……

你能帮忙吗?谢谢。。

【问题讨论】:

    标签: python matrix adjacency-matrix matrix-transform


    【解决方案1】:

    您还需要在打印出各个单元格时列举列标题。

    对于矩阵文件ma​​t.csv

    null,A,B,C
    A,0,2,3
    B,3,4,2
    C,1,2,4
    

    以下程序:

    csv = open("mat.csv")
    
    columns = csv.readline().strip().split(',')[1:]
    for line in csv:
        tokens = line.strip().split(',')
        row = tokens[0]
        for column, cell in zip(columns,tokens[1:]):
            print '{},{},{}'.format(row,column,cell)
    

    打印出来:

    A,A,0
    A,B,2
    A,C,3
    B,A,3
    B,B,4
    B,C,2
    C,A,1
    C,B,2
    C,C,4
    

    要生成上对角线,您可以使用以下脚本:

    csv = open("mat.csv")
    
    columns = csv.readline().strip().split(',')[1:]
    for i, line in enumerate(csv):
        tokens = line.strip().split(',')
        row = tokens[0]
        for column, cell in zip(columns[i:],tokens[i+1:]):
            print '{},{},{}'.format(row,column,cell)
    

    导致输出:

    A,A,0
    A,B,2
    A,C,3
    B,B,4
    B,C,2
    C,C,4
    

    【讨论】:

    • 设置 col=row 而不是 col=0
    【解决方案2】:

    你需要跳过每一行的第一列:

    for t in tokens[1:]:
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      • 2020-09-07
      • 2018-03-01
      • 1970-01-01
      相关资源
      最近更新 更多