Python:使用位。用零和一编码核苷酸

标签 python bit bioinformatics

我想在 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 在该序列中出现的次数。例如:

'ATGAATGAA' # with a sliding window of 5 would be
 dic = { 'ATGAA':2, 'TGAAT':1, 'GAATG':1, 'AATGA':1, }

因为我想在开始读取序列之前用大小为 k 的“AGTC”的所有可能组合构建字典,以便以每个 k-mer 作为键访问该字典并将 1 与其值相加,我想知道是否可以使用位编码存储该字典上的 k-mers。或多或少:

dic = {1011001010: 3, 0000110011: 666, ...  etc }

目前我正在使用 itertools 构建该字典。

# k-mers of size 8
{''.join(x):0 for x in itertools.product('ATGC', repeat=8)}

我想另一个问题是每个 k-mer 都需要转换为该位编码才能访问字典

最佳答案

您可以将 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:使用位。用零和一编码核苷酸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27869839/

相关文章:

python - 如何解决为用户指定未知字段(Id_card_number)的问题?

python - import modulename 的使用与导入模块的命名空间有什么关系?

c - 在 C 语言中,如何使用 printf() 函数将字符串设为 'store'?

在c语言中可以创建一个只有一位的变量吗?

R:按年龄计算风险时间

python - 在Pandas Python中做与Pivot相反的事情

python - 为 matplotlib tricontourf 设置掩码

c - 交换字符位并在交换后将其替换为新创建的字符

python - 生成循环谱

bash - 将两个列表与列上的联接结合起来