【问题标题】:Building a matrix in python在python中构建矩阵
【发布时间】:2012-08-13 19:32:01
【问题描述】:

这里是 Python 初学者。 我有两个具有相同格式的制表符分隔信息的文本文件。它们包含 3 列(标识符、染色体和位置)的行,例如:

文件 1:

2323 2 125
2324 3 754

...等

文件 2:

2323 2 150
2324 3 12000

...等

我想通过遍历每个标识符(每行的第一列)来创建一个列表或矩阵(不确定什么是最好的或它是如何工作的,也许是一个变成矩阵的列表列表?!)文件并将其与其位置(column3)相关联,然后在下一个文件中找到此匹配标识符,并将另一个位置(column3)保存在此文件中。所以最后每个标识符将与来自两个不同文件的 2 个不同位置相关联。

这是我需要帮助的。下一步,我将寻找位置之间数值差异最大的标识符。

非常感谢任何帮助、提示或解决方案,我是一名 Python 初学者,具有非常基础的知识。

非常感谢!

鲁巴尔

【问题讨论】:

  • 我不确定我是否理解您要使用您在两个文件的第 3 列中获得的两个值来构建什么。你能澄清一下想要的输出是什么吗?结果是您想写回其中一个文件,还是您将用于进一步处理的结果?

标签: python list text matrix


【解决方案1】:

您的问题可能有多种答案:

  1. 如果您打算对矩阵进行大量计算,我建议您查看非常高效的numpy 库。您可以了解如何使用 numpy here 创建矩阵。
  2. 您的问题的第二个可能答案是使用biopython 库(我已经得出结论,您正在使用染色体)。
  3. 您可以使用 Python 嵌套列表来创建矩阵。

这是一个代码 sn-p 说明如何做到这一点(假设我们正在从文件 2 中读取)

matrix = []
with open(path_to_file2, 'rt') as f:
    for line in f:
        matrix.append(map(int, line.strip().split(' ')))

然后您可以获取创建的矩阵的值:

matrix[0]     # First row == [2323, 2, 150]
matrix[0][1]  # Second column, first row == 2

【讨论】:

    【解决方案2】:
    import collections
    d=collections.defaultdict(list)
    for f in ('file1','file2'):
        with open(f) as f1:
            for line in f1:
                ident, chrom, pos = line.split()
                d[ident].append(int( pos ))
    
    
    #big differences at end of list
    items = sorted(d.items(), key = lambda item: abs(item[1][1] - item[1][0])) 
    
    #big differences at beginning of list
    #items = sorted(d.items(), reverse = True, key = lambda item: abs(item[1][1] - item[1][0])) 
    

    在此解决方案中,我将文件中的信息存储为字典。键是标识符,值是包含位置的列表。然后,我根据位置列表中第一个和第二个元素之间差异的绝对值对该字典的项目进行排序。换句话说,最大的区别在items 列表的末尾。

    为了使其工作,它假定file1file2 具有相同的标识符。如果没有,您首先需要过滤项目以仅挑选出长度为 2 的字典条目。例如

    items = [(k,v) for k,v in d.items() if len(v) == 2]
    items = sorted(items, ...)
    

    【讨论】:

      【解决方案3】:

      您可以使用以标识符作为键、位置列表作为值的字典。然后您可以计算位置之间的差异并将其作为列表的第三个元素。然后,您可以遍历字典,在字典值的位置 [2] 中找到最大值。

      d = {}
      for each line in file1:
         d[identifier] = [position]
      
      for each line in file2:
         d[identifier].append(position)
         d[identifier].append(d[identifier][1]-d[identifier][0])
      
      maxDiff = 0
      for x in d:
          value = d[x][2]
          if value > maxDiff:
              maxDiff = value
      

      【讨论】:

        猜你喜欢
        • 2016-02-06
        • 2018-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多