2014-03-04 54 views
3

我目前正在使用一些DNA序列數據,並且需要爲每個站點創建一個頻率矩陣。例如,這樣的事情:訪問避免嵌套for循環的字符串列表中的每個字符

A T G C 
0.2 0.3 0.3 0.2 
0.3 0.4 0.1 0.2 
0.7 0.1 0.1 0.1 

輸入是許多DNA序列的列表,例如:

te_seqs = ["ATCTACTGATG", "ATACAGTACATAGA", "ATAGACAGTTGTGCG", "GTCGATACGT", ...] 

每個序列是成千上萬個字符長和有成千上萬序列。輸出是一個numpy矩陣,包含每個站點的頻率計數。例如,在上面的數據中,第一個站點有3個As和1個G,所以A的頻率是3/4 = 0.75,而G的頻率是1/4 = 0.25。 T和C的頻率都是0.

我目前有一個我所有序列的列表,並且我正在通過將Nx4矩陣加1來獲得頻率。問題是,我有很多的序列工作和嵌套的for循環聰明並不理想時間:

for seq in te_seqs: 
    for i,nuc in enumerate(seq): 
     if nuc == "A": 
      te_pwm[i, 0] = te_pwm[i, 0] + 1 
     elif nuc == "T": 
      te_pwm[i, 1] = te_pwm[i, 1] + 1 
     elif nuc == "G": 
      te_pwm[i, 2] = te_pwm[i, 2] + 1 
     elif nuc == "C": 
      te_pwm[i, 3] = te_pwm[i, 3] + 1 

for seq in gene_seqs: 
    for i,nuc in enumerate(seq): 
     if nuc == "A": 
      gene_pwm[i, 0] = gene_pwm[i, 0] + 1 
     elif nuc == "T": 
      gene_pwm[i, 1] = gene_pwm[i, 1] + 1 
     elif nuc == "G": 
      gene_pwm[i, 2] = gene_pwm[i, 2] + 1 
     elif nuc == "C": 
      gene_pwm[i, 3] = gene_pwm[i, 3] + 1 

我的問題是:1)是在有刺的列表,檢查每個串的更Python的方式? 2)是否有更好的方法來創建基頻的矩陣?

謝謝!

+1

能否請您給一些測試數據? – thefourtheye

+0

是的,我使用這裏的數據:http://maizetedb.org/cgi-bin/cgiwrap/maize/TE_search.cgi。點擊II級並下載該數據。這裏有更多的信息:http://nbviewer.ipython.org/gist/arundurvasula/9338256,但這個寫起來是未完成的 – ohblahitsme

+0

你可以請示例輸入和輸出解釋你的程序?它現在還不清楚。 – thefourtheye

回答

4

你可以使用itertools.izip_longest()遍歷網站,然後使用collections.Counter做計數:

import collections 
import itertools 

te_seqs = ["ATCTACTGATG", "ATACAGTACATAGA", "ATAGACAGTTGTGCG", "GTCGATACGT"] 

sites = map(collections.Counter, itertools.izip_longest(*te_seqs)) 
for site in sites: 
    A = site.get("A", 0) 
    T = site.get("T", 0) 
    G = site.get("G", 0) 
    C = site.get("C", 0) 
    total = float(A + T + G + C) 
    print A/total, T/total, G/total, C/total 

這將產生

0.75 0.0 0.25 0.0 
0.0 1.0 0.0 0.0 
0.5 0.0 0.0 0.5 
0.0 0.25 0.5 0.25 
1.0 0.0 0.0 0.0 
0.0 0.25 0.25 0.5 
0.5 0.5 0.0 0.0 
... 
+0

謝謝!我稍微修改了一下這個解決方案,以便將頻率添加到一個numpy數組中,但是這個效果很好。再次感謝! – ohblahitsme