Преобразование выравнивания ДНК в массив numpy с помощью biopython

У меня есть несколько последовательностей ДНК, которые были выровнены, и я хотел бы сохранить только те основания, которые варьируются в определенном положении.

Возможно, это можно сделать, если мы сначала преобразуем выравнивание в массив. Я пытался использовать код из руководства по 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

person newa123    schedule 29.09.2016    source источник
comment
Вы пробовали просто print(align_array.shape)?   -  person wflynny    schedule 29.09.2016
comment
Выводит (1, 99, 16926)   -  person newa123    schedule 29.09.2016
comment
Так что, возможно, это сработало   -  person newa123    schedule 29.09.2016


Ответы (2)


AlignIO не похоже на инструмент, который вам нужен для этой работы. У вас есть файл, предположительно содержащий множество последовательностей, а не множество множественных выравниваний последовательностей, поэтому вы, вероятно, захотите использовать SeqIO, а не AlignIO (источник). Вот почему форма вашего массива (1, 99, 16926), потому что у вас есть 1 выравнивание из 99 последовательностей длиной 16926.

Если вам просто нужен массив последовательностей (что, похоже, вы делаете из np.character dtype, предоставленного np.array), сделайте следующее:

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. Любой из них должен работать, но я выбрал способ использования атрибута, так как он более явный.

person wflynny    schedule 29.09.2016

Я отвечаю на вашу проблему вместо того, чтобы исправлять ваш код. Если вы хотите сохранить только определенные позиции, вы хотите использовать AlignIO:

Образец ФАСТА al.fas:

>seq1
CATCGATCAGCATCGACATGCGGCA-ACG
>seq2
CATCGATCAG---CGACATGCGGCATACG
>seq3
CATC-ATCAGCATCGACATGCGGCATACG
>seq4
CATCGATCAGCATCGACAAACGGCATACG

Теперь предположим, что вы хотите сохранить только определенные позиции. MultipleSeqAlignment позволяет вам запросить выравнивание как массив 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_alignment_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)
person xbello    schedule 30.09.2016