1

我想计算一长串序列之间的成对差异的数量,并将其放回矩阵形式。

我有几百个基因序列,每个序列已经对齐并且长度相同(大约 300 个字符)。我不是在寻找一种编辑距离算法(汉明、莱文斯坦等),而是想获得两个序列之间绝对差异的数量。必须在每个字符位置比较序列。

例如,

Sequence 1: "GAT-ACA"
Sequence 2: "AT-GCGA"
Number of differences: 6

(破折号允许序列对齐,我的序列也可能包括破折号)。

是否有任何有效的方法可以使用 python(或其他语言)在很短的计算时间内做到这一点?我也在 R 中问过这个问题,最初打算这样做,但结果太慢,无法应用于数百个序列。

谢谢!

4

3 回答 3

4

如果要计算显示对之间差异的矩阵,可以这样做:

import numpy as np

def get_difference(x,y):
    return sum(ele_x != ele_y for ele_x, ele_y in zip(x,y))

my_list = ['abcde','abcwe','zbfwe']
n = len(my_list)

my_array = np.zeros((n,n))
#
for i, ele_1 in enumerate(my_list):
    for j, ele_2 in enumerate(my_list):
        if j >= i:
            break # Since the matrix is symmetrical we don't need to
                  # calculate everything
        difference = get_difference(ele_1, ele_2)  
        my_array[i, j] = difference
        my_array[j, i] = difference

结果:

>>> my_array
array([[ 0.,  1.,  3.],
       [ 1.,  0.,  2.],
       [ 3.,  2.,  0.]])

生成的矩阵(OK 数组)显示了对之间的差异。

于 2012-07-08T19:14:44.400 回答
2

将字符串压缩成元组 - 然后使用 sum 来计算布尔 True(即非匹配点)。

s1 = "GAT-ACA"
s2 = "AT-GCGA"

print sum(a != b for (a,b) in zip(s1, s2))
于 2012-07-08T19:04:43.313 回答
0

如果我理解得很好,只需:

diff = lambda seq1, seq2: sum(seq1[i]!=seq2[i] for i in range(len(seq1)))
于 2012-07-08T18:56:48.563 回答