我想计算一长串序列之间的成对差异的数量,并将其重新放回矩阵形式。
我有几百个基因序列,每个序列已经对齐并且具有相同的长度(大约300个字符)。我不是在寻找编辑距离算法之一(汉明,莱文斯坦等),而是希望获得两个序列之间的绝对差异数。必须在每个字符位置比较序列。
例如,
Sequence 1: "GAT-ACA"
Sequence 2: "AT-GCGA"
Number of differences: 6
(破折号用于允许序列对齐,我的序列也可能包含破折号。)
使用python(或其他语言)是否有任何有效的方法,计算时间短?我也在R中问过这个问题,最初打算这样做,但结果太慢,无法应用于数百个序列。
谢谢!
答案 0 :(得分: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数组)显示了对之间的差异。
答案 1 :(得分:2)
将字符串压缩成元组 - 然后使用sum计算布尔值(即非匹配点)。
s1 = "GAT-ACA"
s2 = "AT-GCGA"
print sum(a != b for (a,b) in zip(s1, s2))
答案 2 :(得分:0)
如果我理解得很好,只需:
diff = lambda seq1, seq2: sum(seq1[i]!=seq2[i] for i in range(len(seq1)))