我目前正在使用一些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)是否有更好的方法來創建基頻的矩陣?
謝謝!
能否請您給一些測試數據? – thefourtheye
是的,我使用這裏的數據:http://maizetedb.org/cgi-bin/cgiwrap/maize/TE_search.cgi。點擊II級並下載該數據。這裏有更多的信息:http://nbviewer.ipython.org/gist/arundurvasula/9338256,但這個寫起來是未完成的 – ohblahitsme
你可以請示例輸入和輸出解釋你的程序?它現在還不清楚。 – thefourtheye