2012-07-08 67 views
1

我想計算長列表序列之間的成對差異數,並將其放回矩陣形式。計算大量序列的成對差異矩陣?

我有幾百個基因序列,每個序列已經對齊,長度相同(約300個字符)。我不在尋找編輯距離算法之一(hamming's,leveinstein等),而是想要獲得兩個序列之間絕對差異的數量。序列必須在每個字符位置進行比較。

例如,

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

(破折號那裏,以允許對準的序列,以及我的序列也可以包括短劃線)。

會有任何有效的方式來做到這一點使用python(或其他語言),計算時間短嗎?我在R中也問過這個問題,最初打算這樣做,但是結果太慢而不適用於數百個序列。

謝謝!

+0

有多大的限制,這可以做多快 - 比較將需要〜O((L)(n^2))其中L是序列長度,雖然有一些更快的方法;請參閱[本開放獲取論文](http://www.biomedcentral.com/1471-2105/8/89) – Argalatyr 2012-07-08 20:26:01

回答

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陣列)顯示了這兩對之間的差異。

+2

比較i == j是否浪費(總是0),並且可以分配對稱單元格(在同一語句中)以填充矩陣的上三角形。 – Argalatyr 2012-07-08 19:22:41

+0

@ Argalatyr,兩者都很好。謝謝。我編輯我的帖子來反映他們。 – Akavall 2012-07-08 19:36:20

+0

謝謝!這正是我所需要的,即使在大量的序列上也沒有時間運行。這肯定比我在R編碼的要好得多。 – 2012-07-11 04:05:46

0

如果我沒理解好,只是:

diff = lambda seq1, seq2: sum(seq1[i]!=seq2[i] for i in range(len(seq1))) 
2

郵編字符串到元組 - 然後用總和來計算布爾Trues(即非匹配點)。

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

print sum(a != b for (a,b) in zip(s1, s2)) 
+0

如果這不是您正在尋找的答案,請張貼更多樣本輸入和輸出。 – 2012-07-08 19:06:25

+0

+1。但我會使用'itertools.izip'。 (除非是Python 3) – 2012-07-08 19:29:35