Python:使用位.用零和1编码核苷酸
作者:互联网
我想在Python中使用位编码来编码核苷酸’A’,’G’,’C’和’T’.例如:
'A' = 00
'G' = 01
'C' = 10
'T' = 11
为了建立一个包含k-mers的巨大词典,如:
dic = { 'ATGACTGACT':231, 'AAATGACGGAC':500 ... }
我认为这可以减少该字典所需的内存量,因为’ATGC’需要4个字节,但同一个字需要8位和位编码.
我不确定是否可以这样做,如果是这样,我怎么能用Python做到这一点
提前致谢!
编辑:对不起,我没有正确解释自己.
我想要的是通过一个由大小为k的滑动窗口的’ATGC’组成的序列,并计算每个k-mer在该seq中出现的次数.例如:
'ATGAATGAA' # with a sliding window of 5 would be
dic = { 'ATGAA':2, 'TGAAT':1, 'GAATG':1, 'AATGA':1, }
因为我想在开始阅读序列之前构建具有大小为k的’AGTC’的所有可能组合的dict,为了访问该dict,每个k-mer作为键并且将其值加1,我想知道如果该字典上的k-mers可以用位编码存储.或多或少:
dic = {1011001010: 3, 0000110011: 666, ... etc }
目前我正在使用itertools构建该dict.
# k-mers of size 8
{''.join(x):0 for x in itertools.product('ATGC', repeat=8)}
我想另一个问题是每个k-mer都需要转换为该位编码才能访问dict
解决方法:
您可以将您的kmers转换为二进制,但正如Ignacio指出您仍然需要知道它们的长度,因此您可能还需要存储它.因此,对于很长的序列,这仍然可以节省内存空间.
下面是一些示例代码,它接受序列,对它们进行编码并再次对它们进行解码:
encoding_map = {'A': 0, 'G': 1, 'C': 2, 'T': 3}
decoding_lst = ['A', 'G', 'C', 'T']
def encode(k):
code = 0
for ch in k:
code *= 4
code += encoding_map[ch]
return code, len(k)
def decode(enc):
code, length = enc
ret = ''
for _ in range(length):
index = code & 3
code >>= 2
ret = decoding_lst[index] + ret
return ret
kmers = ['ATGACTGACT', 'ATGC', 'AATGC']
kmerdict = {k: encode(k) for k in kmers}
print(kmerdict)
for key, enc in kmerdict.items():
print(enc, decode(enc))
典型输出:
{'AATGC': (54, 5), 'ATGC': (54, 4), 'ATGACTGACT': (215883, 10)}
(54, 5) AATGC
(54, 4) ATGC
(215883, 10) ATGACTGACT
顺便说一句,序列有多长并不重要,Python应该能够处理编码和解码,因为整数扩展到足够的位来保存数字.
标签:python,bit,bioinformatics 来源: https://codeday.me/bug/20190830/1766409.html