2016-09-29 22 views
3

私はいくつかのDNA配列を整列させており、特定の位置に可変な塩基のみを保持したいと考えています。biopythonを使用してnumpyアレイに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 
+0

'print(align_array.shape)'を試したことがありますか? – wflynny

+0

それは(1,99,16926) – newa123

+0

を出力します – newa123

答えて

1

AlignIOは、あなたがこの仕事のために必要なツールではないようです。おそらく、複数の配列アラインメントではなく、多くの配列を含むファイルがあるので、おそらくではなく、AlignIOsource)を使用することをお勧めします。これは、配列の形状が(1,99,16926)である理由です。長さ16926の配列99個の配列が1つあるためです。

配列の配列が必要な場合は、 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 SeqRecordlist(record)はシーケンスを取得するためのショートカットです。もう1つはrecord.seqです。いずれもうまくいくはずですが、より明示的なので属性の使い方を選択しました。

1

私はあなたのコードを修正するのではなく、あなたの問題に答えています。あなたが唯一の特定の位置を維持したい場合は、AlignIOを使用したい:

FASTAサンプルal.fas

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

今、あなたが唯一の特定の位置を維持するとします。あなたはlenget_alignment_lengthを使用し、アライメントの形状を知りたい場合は

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]) 

MultipleSeqAlignmentあなたはクエリ numpyの配列のようなアライメントを可能に

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

使用しますAlignIO.parse()はアラインメントをロードするために、解析対象のファイルに複数のアラインメントが含まれている可能性があると想定します(PHYLIPはこれを行います)。したがって、パーサは、コードが示すように、各アラインメントに対してイテレータを返し、レコードに対してはイテレータを返しません。しかし、あなたのFASTAファイルは1ファイルにつき1つの整列しか含まず、parse()は1つだけ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) 
関連する問題