2017-04-25 33 views
0

的段I想比較與給定的「對準的窗口」,即兩個序列,如果序列是在五個或更多的拉伸類似。如何控制序列比對

例如:

A = "CCCTCGTTGCTAAAAA" 
B = "CCCAGCAACGAAAAAA" 

我想,以紀念在矩陣中的命中只有最後5個字符

現在我堅持我有這樣的事情:

import numpy as np 


A = "CCCTCGTTGCTAAAAA" 
B = "CCCAGCAACGAAAAAA" 
n1 = len(A) 
n2 = len(B) 
data = np.zeros(shape=(n2, n1), dtype=np.int) 

for i in range(n2): 
for j in range(n1): 
    if A[i:i+4] == B[j:j+4]: 
     data[i:i+4,j:j+4] = 1 
print data 

感謝您的幫助

使用Python 2.7.3

+0

我不是一個bioinfo的人,但每次我看到幾個密碼子,這使我的頭腦[BioPython]最先庫(http://biopython.org/DIST/docs/tutorial/Tutorial.html )。你一定要看看它,特別是在[解析示例](http://biopython.org/DIST/docs/tutorial/Tutorial.html#htoc10)。 –

+0

您正在尋找更快的算法,還是隻是一個更乾淨的方法來做到這一點?你可以通過使用範圍(n-4)來修剪掉大約8n個測試(因爲你不能匹配5個以上的窗口少於5個密碼子),並且xrange()會爲你提供更高效的內存迭代器。 你也許能夠做的更好使用字典來創建一個所有不同的5元子的查找,他們開始點的列表,然後查找每個5元子在對這個表B中。這會給你所有的A點你的當前子串匹配。 – pcurry

+0

感謝您的幫助,我也將嘗試檢查該解決方案 –

回答

0

下面是一個有效的例子。注意+5而不是+4,因爲從i:i + 1的Python切片列表表示需要一個字符。此外,由於檢查短於5個字符的部分沒有意義,所以可以減少n1和n2。

import numpy as np 


A = "CCCTCGTTGCTAAAAA" 
B = "CCCAGCAACGAAAAAA" 
n1 = len(A) - 4 
n2 = len(B) - 4 
data = np.zeros(shape=(n2, n1), dtype=np.int) 


for i in range(n2): 
    for j in range(n1): 
     if A[i:i+5] == B[j:j+5]: 
      data[i:i+5,j:j+5] = 1 
print(data) 

有了這個代碼,你得到兩個安打,曾經爲「CCCAGCAACG AAAAA A」與字符串A的最後一部分,一次用於「CCCAGCAACGA AAAAA」,也與字符串的最後一部分A.

希望這有助於。

+0

我沒想到這件事就這樣,謝謝。但是,如果條件滿足,矩陣上的最終結果應該在每次擊中時輸入1。同時我們只爲最後的核苷酸命中。 –