在python中构建矩阵

时间:2012-08-13 19:32:02

标签: python list text matrix

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

文件1:

2323 2 125
2324 3 754

...等

文件2:

2323 2 150
2324 3 12000

...等

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

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

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

非常感谢提前!

Rubal

3 个答案:

答案 0 :(得分:2)

您的问题可以有几个答案:

  1. 如果您计划对矩阵使用大量计算,我建议您查看非常有效的numpy库。您可以看到如何使用numpy here创建矩阵。
  2. 你问题的第二个可能答案是使用biopython库(我已经得出你正在使用染色体的结论)。
  3. 您可以使用Python嵌套列表来创建矩阵。
  4. 以下是如何执行此操作的代码段(假设我们正在从文件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
    

答案 1 :(得分: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, ...)

答案 2 :(得分:1)

您可以使用具有标识符作为键的字典和位置列表作为值。然后,您可以计算位置之间的差异,并将其作为列表的第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