【问题标题】:Populate arrays in python (numpy)?在python(numpy)中填充数组?
【发布时间】:2011-05-27 09:34:18
【问题描述】:

给定一个格式如下的文件:

a a 0
a b 1
a c 1
b b 0
b a 1
b c 1
c c 0
c a 1
c b 1

第三列是第一列和第二列中的项目之间的距离。如果我将这样的文件作为嵌套列表读入pyton,如何将其转换为对称矩阵,即,

  a b c
a 0 1 1
b 1 0 1
b 1 1 0

?我还希望包括列名和行名。

我希望使用 numpy 来完成这项任务。

有什么建议吗?

谢谢, D.

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:
    import numpy as np
    from itertools import count
    
    data = [line.split() for line in inputfile.readlines()]
    rows = dict(zip(sorted(set(line[0] for line in data)), count()))
    cols = dict(zip(sorted(set(line[1] for line in data)), count()))
    array = np.zeros((len(rows), len(cols)))
    
    for row, col, val in data:
        index = (rows[row], cols[col])
        array[index] = val
    

    我不知道如何在 numpy 中标记行和列,所以我只是做了一个 dict 将行标签映射到行索引,另一个对列做同样的事情。如果需要,您可以制作一个反向映射,如下所示,或者您可以将行和列设置为 bidict

    rows_reverse = dict((v, k) for k, v in rows)
    cols_reverse = dict((v, k) for k, v in cols)
    

    【讨论】:

      【解决方案2】:

      稍微不同的方法:

      import numpy as np
      # Load "Row Col Value" text file
      ar = np.loadtxt('file.txt', [('R','|S1'), ('C','|S1'), ('V','i')])
      names = np.unique(np.row_stack((ar['R'], ar['C']))).tolist()
      vf = np.vectorize(lambda x: names.index(x), otypes='i')
      # load them in an output array
      out = np.empty((len(names), len(names)), 'i')
      out[vf(ar['R']), vf(ar['C'])] = ar['V']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-19
        • 1970-01-01
        • 2018-05-07
        • 2016-06-15
        • 2022-12-10
        • 2016-11-06
        • 2011-08-06
        • 1970-01-01
        相关资源
        最近更新 更多