几个小时以来我一直试图找出这个生物信息学代码有什么问题,但我看不到它。我的函数的各个部分似乎有效,但它没有看到某些模式。我使用滑动窗口函数来返回长度 k
的特定碱基对组合在一段文本中出现的次数。
我需要的第一个函数本质上创建核苷酸字符串四进制数的索引:
nucs = {'A':0,'C':1,'G':2,'T':3}
def PatternToNumber(Pattern):
index = 0
power = []
for i in range(len(Pattern)-1,-1,-1):
power.append(i)
for i in range(len(Pattern)):
index += nucs[Pattern[i]]*(4**power[i])
return index
我使用的下一个函数会迭代一段文本,并将 1 添加到频率数组中的索引。
def ComputingFrequencies(Text,k):
FrequencyArray = [0]*(4**k)
for i in range(len(Text)-k):
Pattern = Text[i:i+k]
index = PatternToNumber(Pattern)
FrequencyArray[index] += 1
print(*FrequencyArray)
就像我说的,我已经研究了每一行,它似乎可以很好地按照我期望的方式将核苷酸模式放入索引号中,但是您运行的输出:
ComputeFrequencies('ACGCGGCTCTGAAA',2)
是:
1 1 0 0 0 0 2 2 1 2 1 0 0 1 1 0
如果您查看 FrequencyArray
中的第一个数字,它会告诉我们字符串“AA”仅显示 1,但文本输入中的最后三个字符是“AAA”,这将意味着“AA”出现了两次,FrequencyArray
中的第一个条目应该是 2 而不是 1。我们应该期望的是:
2 1 0 0 0 0 2 2 1 2 1 0 0 1 1 0
如果我没有很好地解释它,如果需要,我可以尝试澄清一下我的代码。
最佳答案
我很确定您只是遇到了 1 误差。因为您只是没有检查到最后一个字符?
for i in range(len(Text)-k):
对于长度 2,它只会迭代到第一个 AA
,因此您只会看到它一次。更改为
for i in range(len(Text)-(k-1)):
我认为这应该会给你你想要的。
关于python - 字典和函数基因映射输出未返回预期频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60011230/