利用biopython将dna比对转化为numpy阵列
我有几个已经对齐的DNA序列,我想只保留在特定位置可变的碱基 如果我们首先将对齐方式转换为数组,这可能是可以做到的。我尝试在Biopython教程中使用该代码,但它给出了一个错误利用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
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
的每个元素也是一个BioPythonSeqRecord
,除了元数据之外,还包括序列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),因此可能会起作用