计算模式频率
Computing Pattern Frequency
我正在尝试制作一个程序来搜索文本,并根据所需的 kmer 长度提取模式。然后,我希望它使用我从 class 中学到的算法将这些模式转换为数字,并将这些值存储到字典中,以便我可以计算每个模式的频率。我知道我可以用模式本身来做,但任务的目标是 return 一系列数字(例如:2 2 2 1 1 3 2
)
到目前为止,我可以递归调用 pat2num
函数,但我无法获取它来计算算法 4 * pat2Num(pattern) + symbol
。而且我什至还没有尝试实现字典。
bases = {'A': 0, 'C': 1, 'G': 2, 'T': 3}
class ComputingFrequencies:
def __init__(self, text, k, list):
self.text = text
self.k = k
self.list = list
def patternGenerator(self):
return self.freqPat(self.text, self.k) #begins the class call
def freqPat(self, text, k):
for i in range(0, len(text) - k + 1): #searches length of text corresponding to size of kmer
pattern = text[i : k + i] #pulls out kmer
self.list.append(pattern) #appends kmer to list
print self.list
return self.pat2Nums(list) #calls pat2Nums
def pat2Nums(self, list):
if len(self.list) == 0:
return 0
else:
for pattern in self.list: #calls pat2Num for each pattern in list
self.pat2Num(pattern)
def pat2Num(self, pattern):
if len(pattern) == 0:
self.list = self.list[1:]
self.pat2Nums(self.list)
else:
symbol = pattern[-1] #symbol is last char of pattern
pattern = pattern[0 : -1] #pattern is (pattern - last char)
if symbol in bases:
symbol = bases[symbol] #symbol becomes number equivalent
print symbol
l = 4 * self.pat2Num(pattern) + symbol #algorithm for turning pattern into number
c = ComputingFrequencies('AGTAGT', 3, list())
c.patternGenerator()
更新:我终于得到了一些有用的东西,产生了所需的输出。还需要将所有可能的结果初始化为 0,因此输出很大,大部分是 0(以防你 运行 它)。这是代码:
import sys
sys.setrecursionlimit(10000)
bases = {'A': 0, 'C': 1, 'G': 2, 'T': 3}
algNum = list()
freqArray = dict()
class ComputingFrequencies:
def __init__(self, text, k, list, list2):
self.text = text
self.k = k
self.list = list
self.list2 = list2
def patternGenerator(self):
return self.freqPat(self.text, self.k) #begins the class call
def freqPat(self, text, k):
for i in range(0, 4**k):
freqArray[i] = 0
for i in range(0, len(text) - k + 1): #searches length of text corresponding to size of kmer
pattern = text[i : k + i] #pulls out kmer
self.list.append(pattern) #appends kmer to list
print self.list
return self.pat2Nums(list) #calls pat2Nums
def pat2Nums(self, list):
if len(self.list) == 0:
l = str(freqArray.values())
m = l.replace(",", "")
print m
#r = open('file')
#r.write(m)
else:
pattern = self.list[0]
return self.pat2Num(pattern)
def pat2Num(self, pattern):
symbol = pattern[-1] #symbol is last char of pattern
pattern = pattern[0 : -1] #pattern is (pattern - last char)
if symbol in bases:
symbol = bases[symbol] #symbol becomes number equivalent
algNum.append(symbol)
if len(pattern) > 0:
return self.pat2Num(pattern)
else:
self.algNum(algNum, self.k)
def algNum(self, list, k):
while len(algNum) > 0:
if len(algNum) == self.k:
symbol = algNum[-1]
prev = symbol
else:
symbol = algNum[-1]
alg = 4 * prev + symbol
prev = alg
del algNum[-1]
freqArray[alg] = freqArray.get(alg, 0) + 1
self.list = self.list[1:]
return self.pat2Nums(self.list)
c = ComputingFrequencies('AGTAGT', 3, list())
c.patternGenerator()
所以基本上我把算法从原来的地方拉出来,将符号值存储在另一个列表中,然后 运行 一旦模式长度变为 0,该数字列表就会通过算法。它是可能不是 prettiest/simplest/best,但它起作用了。感谢大家的编辑!
另外,请注意递归限制增加。我知道这可能不太好。欢迎对迭代器提出任何建议(我还没学会!)
问题似乎出在您的函数 pat2Num()
和计算 l
的行上。目前还不太清楚 l
应该被计算为什么。
原因是 l
陷入无限循环,直到 pattern == None
。让我们来看看它:
- 发起
pat2Num('AGT')
pattern = 'AGT'
symbol = 'T'
- 模式变为
'AG'
- 计算
l
,但在公式中你记得 pat2Num('AG')
使用新模式。
- 这意味着
l
从未被计算或存储为任何东西,因为之前对 pat2Num()
的调用从未返回任何东西存储在 l
. 中
- 重新启动该功能后,
symbol
现在变为 G
pattern
现在变成 A
- 计算
l
,但回忆 pat2Num('A')
,从不在 l
中存储任何内容
symbol
现在变成 A
pattern
现在变成 None
- 计算
l
,但现在 pattern
什么都不是,所以要么是 None 类型错误,要么是无限循环
回过头来考虑 l = 4 * self.pat2Num(pattern) + symbol
行,也许计算 l
并存储在某处,然后再调用函数。然后 sum values 是列表或类似的东西。
希望对您有所帮助
我正在尝试制作一个程序来搜索文本,并根据所需的 kmer 长度提取模式。然后,我希望它使用我从 class 中学到的算法将这些模式转换为数字,并将这些值存储到字典中,以便我可以计算每个模式的频率。我知道我可以用模式本身来做,但任务的目标是 return 一系列数字(例如:2 2 2 1 1 3 2
)
到目前为止,我可以递归调用 pat2num
函数,但我无法获取它来计算算法 4 * pat2Num(pattern) + symbol
。而且我什至还没有尝试实现字典。
bases = {'A': 0, 'C': 1, 'G': 2, 'T': 3}
class ComputingFrequencies:
def __init__(self, text, k, list):
self.text = text
self.k = k
self.list = list
def patternGenerator(self):
return self.freqPat(self.text, self.k) #begins the class call
def freqPat(self, text, k):
for i in range(0, len(text) - k + 1): #searches length of text corresponding to size of kmer
pattern = text[i : k + i] #pulls out kmer
self.list.append(pattern) #appends kmer to list
print self.list
return self.pat2Nums(list) #calls pat2Nums
def pat2Nums(self, list):
if len(self.list) == 0:
return 0
else:
for pattern in self.list: #calls pat2Num for each pattern in list
self.pat2Num(pattern)
def pat2Num(self, pattern):
if len(pattern) == 0:
self.list = self.list[1:]
self.pat2Nums(self.list)
else:
symbol = pattern[-1] #symbol is last char of pattern
pattern = pattern[0 : -1] #pattern is (pattern - last char)
if symbol in bases:
symbol = bases[symbol] #symbol becomes number equivalent
print symbol
l = 4 * self.pat2Num(pattern) + symbol #algorithm for turning pattern into number
c = ComputingFrequencies('AGTAGT', 3, list())
c.patternGenerator()
更新:我终于得到了一些有用的东西,产生了所需的输出。还需要将所有可能的结果初始化为 0,因此输出很大,大部分是 0(以防你 运行 它)。这是代码:
import sys
sys.setrecursionlimit(10000)
bases = {'A': 0, 'C': 1, 'G': 2, 'T': 3}
algNum = list()
freqArray = dict()
class ComputingFrequencies:
def __init__(self, text, k, list, list2):
self.text = text
self.k = k
self.list = list
self.list2 = list2
def patternGenerator(self):
return self.freqPat(self.text, self.k) #begins the class call
def freqPat(self, text, k):
for i in range(0, 4**k):
freqArray[i] = 0
for i in range(0, len(text) - k + 1): #searches length of text corresponding to size of kmer
pattern = text[i : k + i] #pulls out kmer
self.list.append(pattern) #appends kmer to list
print self.list
return self.pat2Nums(list) #calls pat2Nums
def pat2Nums(self, list):
if len(self.list) == 0:
l = str(freqArray.values())
m = l.replace(",", "")
print m
#r = open('file')
#r.write(m)
else:
pattern = self.list[0]
return self.pat2Num(pattern)
def pat2Num(self, pattern):
symbol = pattern[-1] #symbol is last char of pattern
pattern = pattern[0 : -1] #pattern is (pattern - last char)
if symbol in bases:
symbol = bases[symbol] #symbol becomes number equivalent
algNum.append(symbol)
if len(pattern) > 0:
return self.pat2Num(pattern)
else:
self.algNum(algNum, self.k)
def algNum(self, list, k):
while len(algNum) > 0:
if len(algNum) == self.k:
symbol = algNum[-1]
prev = symbol
else:
symbol = algNum[-1]
alg = 4 * prev + symbol
prev = alg
del algNum[-1]
freqArray[alg] = freqArray.get(alg, 0) + 1
self.list = self.list[1:]
return self.pat2Nums(self.list)
c = ComputingFrequencies('AGTAGT', 3, list())
c.patternGenerator()
所以基本上我把算法从原来的地方拉出来,将符号值存储在另一个列表中,然后 运行 一旦模式长度变为 0,该数字列表就会通过算法。它是可能不是 prettiest/simplest/best,但它起作用了。感谢大家的编辑!
另外,请注意递归限制增加。我知道这可能不太好。欢迎对迭代器提出任何建议(我还没学会!)
问题似乎出在您的函数 pat2Num()
和计算 l
的行上。目前还不太清楚 l
应该被计算为什么。
原因是 l
陷入无限循环,直到 pattern == None
。让我们来看看它:
- 发起
pat2Num('AGT')
pattern = 'AGT'
symbol = 'T'
- 模式变为
'AG'
- 计算
l
,但在公式中你记得pat2Num('AG')
使用新模式。 - 这意味着
l
从未被计算或存储为任何东西,因为之前对pat2Num()
的调用从未返回任何东西存储在l
. 中
- 重新启动该功能后,
symbol
现在变为G
pattern
现在变成A
- 计算
l
,但回忆pat2Num('A')
,从不在l
中存储任何内容
symbol
现在变成A
pattern
现在变成None
- 计算
l
,但现在pattern
什么都不是,所以要么是 None 类型错误,要么是无限循环
回过头来考虑 l = 4 * self.pat2Num(pattern) + symbol
行,也许计算 l
并存储在某处,然后再调用函数。然后 sum values 是列表或类似的东西。
希望对您有所帮助