利用biopython将dna比对转化为numpy阵列

利用biopython将dna比对转化为numpy阵列,python,numpy,biopython,Python,Numpy,Biopython,我有几个已经对齐的DNA序列,我想只保留在特定位置可变的碱基 如果我们首先将对齐方式转换为数组,这可能是可以做到的。我尝试在Biopython教程中使用该代码,但它给出了一个错误 import numpy as np from Bio import AlignIO alignment = AlignIO.parse("ma-all-mito.fa", "fasta") align_array = np.array([list(rec) for rec in alignment], np.char

我有几个已经对齐的DNA序列,我想只保留在特定位置可变的碱基

如果我们首先将对齐方式转换为数组,这可能是可以做到的。我尝试在Biopython教程中使用该代码,但它给出了一个错误

import numpy as np
from Bio import AlignIO
alignment = AlignIO.parse("ma-all-mito.fa", "fasta")
align_array = np.array([list(rec) for rec in alignment], np.character)
print("Array shape %i by %i" % align_array.shape)
我得到的错误是:

Traceback (most recent call last):

File "C:/select-snps.py", line 8, in <module>
    print("Array shape %i by %i" % align_array.shape)
TypeError: not all arguments converted during string formatting
回溯(最近一次呼叫最后一次):
文件“C:/select snps.py”,第8行,在
打印(“阵列形状%i乘%i”%align\u Array.shape)
TypeError:在字符串格式化过程中并非所有参数都已转换

AlignIO
似乎不是您想要用于此工作的工具。您可能有一个包含许多序列的文件,而不是多个序列比对,因此您可能希望使用
SeqIO
,而不是
AlignIO
()。这就是为什么数组的形状是(1,99,16926),因为您有一个长度为16926的99个序列的对齐

如果您只需要一个序列数组(似乎是从提供给
np.array
np.character
dtype中执行的),请执行以下操作:

import numpy as np
from Bio import SeqIO
records = SeqIO.parse("ma-all-mito.fa", "fasta")
align_array = np.array([record.seq for record in records], np.character)
print("Array shape %i by %i" % align_array.shape)
# expect to be (99, 16926)

请注意,从技术上讲,
records
的每个元素也是一个BioPython
SeqRecord
,除了元数据之外,还包括序列
list(record)
是获取序列的快捷方式,另一种方式是
record.seq
。两者都可以,但我选择使用属性方式,因为它更明确。

我是在回答您的问题,而不是修复您的代码。如果只想保持某些位置,则需要使用
AlignIO

FASTA样本
al.fas

>seq1
CATCGATCAGCATCGACATGCGGCA-ACG
>seq2
CATCGATCAG---CGACATGCGGCATACG
>seq3
CATC-ATCAGCATCGACATGCGGCATACG
>seq4
CATCGATCAGCATCGACAAACGGCATACG
现在假设您只想保留某些位置。允许您像numpy数组一样查询路线:

from Bio import AlignIO


al = AlignIO.read("al.fas", "fasta")

# Print the 11th column
print(al[:, 10])

# Print the 12-15 columns
print(al[:, 11:14])
如果您想知道对齐的形状,请使用
len
get\u alignment\u length

>>> print(len(al), al.get_alignment_length())
4 29

使用
AlignIO.parse()
加载对齐方式时,它假定要分析的文件可能包含多个对齐方式(PHYLIP会这样做)。因此,解析器在每个对齐上返回一个迭代器,而不是像代码所暗示的那样在记录上返回迭代器。但是您的FASTA文件每个文件只包含一个对齐方式,
parse()
只生成一个
MultipleSeqAlignment
。因此,对代码的修复是:

alignment = AlignIO.read("ma-all-mito.fa", "fasta")
align_array = np.array(alignment, np.character)
print("Array shape %i by %i" % align_array.shape)

您是否尝试过简单地打印(align_array.shape)?它会输出(1、99、16926),因此可能会起作用