1

すべてのノードが x、y 座標のペアであるツリーを格納してから操作 (新しいノードの追加、検索など) する必要があります。ツリーで動作する ete2 モジュールを見つけましたが、ノードをタプルまたは座標のリストとして保存する方法がわかりません。ete2で可能ですか?

編集:

ここのチュートリアルに従いましたhttp://pythonhosted.org/ete2/tutorial/tutorial_trees.html#trees 単純なツリーを作成するには:

t1 = Tree("(A:1,(B:1,(E:1,D:1):0.5):0.5);" )

ここで、A、B、C はノードの名前で、数字は距離です。

また

t2 = Tree( "(A,B,(C,D));" )

名前や距離は必要ありませんが、次のようなタプルまたはリストのツリーが必要です。

t3 = Tree("([12.01, 10.98], [15.65, 12.10],([21.32, 6.31], [14.53, 10.86]));")

しかし、最後の入力は構文エラーを返します。ete2 に関するチュートリアルでは、同様の例が見つかりませんでした。バリアントとして、座標を属性として保存できると思いますが、属性は文字列として保存されます。私は座標で操作する必要があり、文字列から浮動小数点数、またはその逆にトラバースするのは毎回難しいです。

4

1 に答える 1

2

任意のタイプのデータを使用してete ツリーに注釈を付けることができます。すべてのノードに名前を付け、その名前を使用してツリー構造を作成し、座標でツリーに注釈を付けるだけです。

from ete2 import Tree

name2coord = {
'a': [1, 1], 
'b': [1, 1], 
'c': [1, 0], 
'd': [0, 1], 
}

# Use format 1 to read node names of all internal nodes from the newick string
t = Tree('((a:1.1, b:1.2)c:0.9, d:0.8);', format=1)     

for n in t.get_descendants():
   n.add_features(coord = name2coord[n.name])

# Now you can operate with the tree and node coordinates in a very easy way: 
for leaf in t.iter_leaves():
    print leaf.name, leaf.coord
# a [1, 1]
# b [1, 1]
# d [0, 1]

print t.search_nodes(coord=[1,0])
# [Tree node 'c' (0x2ea635)]

pickle を使用して、注釈付きのツリーをコピー、保存、および復元できます。

t.copy('cpickle')
# or
import cPickle
cPickle.dump(t, open('mytree.pkl', 'w'))
tree = cPickle.load(open('mytree.pkl'))
于 2014-03-03T14:41:12.150 に答える