编程语言
首页 > 编程语言> > Python:使用位.用零和1编码核苷酸

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