2012-02-20 19 views
5

Tôi có một danh sách các vectơ tạo ra bằng cách chạy:chuyển đổi ndarray tạo ra bởi hcluster thành một chuỗi Newick để sử dụng với ete2 gói

import hcluster 
import numpy as np 
from ete2 import Tree 

vecs = [np.array(i) for i in document_list] 

nơi document_list là một tập hợp các tài liệu web tôi đang phân tích. sau đó tôi thực hiện phân nhóm theo thứ bậc:

Z = hcluster.linkage(vecs, metric='cosine') 

này tạo ra một ndarray như:

[[ 12.   19.   0.   1.  ] 
[ 15.   21.   0.   3.  ] 
[ 18.   22.   0.   4.  ] 
[ 3.   16.   0.   7.  ] 
[ 8.   23.   0.   6.  ] 
[ 5.   27.   0.   6.  ] 
[ 1.   28.   0.   7.  ] 
[ 0.   21.   0.   2.  ] 
[ 5.   29.   0.18350472 2.  ] 
[ 2.   10.   0.18350472 3.  ] 
[ 47.   30.   0.29289577 9.  ] 
[ 13.   28.   0.29289577 13.  ] 
[ 73.   32.   0.29289577 18.  ] 
[ 26.   12.   0.42264521 5.  ] 
[ 5.   33.   0.42264521 12.  ] 
[ 14.   35.   0.42264521 12.  ] 
[ 19.   35.   0.42264521 18.  ] 
[ 4.   20.   0.31174826 3.  ] 
[ 34.   21.   0.5   19.  ] 
[ 38.   29.   0.31174826 21.  ]] 

Có thể chuyển đổi ndarray này thành một chuỗi newick có thể được truyền cho Tree ete2() constructor để tôi có thể vẽ và thao tác cây mới bằng các công cụ được cung cấp bởi ete2? Có một số cách khác để tôi có thể tạo ra một cây/dendrogram sử dụng cùng một dữ liệu và ete2 (tôi nhận ra rằng có những gói khác có thể vẽ các chương trình dendrogram chẳng hạn như dendropy). và hcluster chính nó nhưng muốn sử dụng ete2 tất cả như nhau)?

Cảm ơn!

Trả lời

3

tôi sử dụng phương pháp sau đây cho khá nhiều điều tương tự:

from hcluster import linkage, to_tree 
from ete2 import Tree 

#hcluster part 
Y = dist_matrix(items, dist_fn) 
Z = linkage(Y, "single") 
T = to_tree(Z) 

#ete2 section 
root = Tree() 
root.dist = 0 
root.name = "root" 
item2node = {T: root} 

to_visit = [T] 
while to_visit: 
    node = to_visit.pop() 
    cl_dist = node.dist /2.0 
    for ch_node in [node.left, node.right]: 
     if ch_node: 
      ch = Tree() 
      ch.dist = cl_dist 
      ch.name = str(ch_node.id) 
      item2node[node].add_child(ch) 
      item2node[ch_node] = ch 
      to_visit.append(ch_node) 

# This is your ETE tree structure 
tree = root 
+1

ooops, lưu ý dist_matrix đó là chức năng riêng của mình để tạo ra các mảng từ xa. Thay thế nó bằng các giá trị của riêng bạn (ví dụ: vecs) – jhc

0

Cập nhật:

from hcluster import linkage, to_tree 
from ete2 import Tree 

#hcluster part 
Y = dist_matrix(items, dist_fn) 
Z = linkage(Y, "single") 

R,T  = to_tree(mat, rd=True) 
#print "ROOT", R, "TREE", T 
root  = Tree() 
root.dist = 0 
root.name = 'root' 
item2node = {R.get_id(): root} 
to_visit = T 

while to_visit: 
    node = to_visit.pop() 
    #print "NODE", node 
    cl_dist = node.dist/2.0 

    for ch_node in [node.get_left(), node.get_right()]: 
     if ch_node: 
      ch_node_id   = ch_node.get_id() 
      ch_node_name  = str(ch_node_id) 
      ch     = Tree() 
      ch.dist   = cl_dist 
      ch.name   = ch_node_name 

      if nodeNames: 
       if ch_node_id < len(nodeNames): 
        ch.name = nodeNames[ ch_node_id ] 

      item2node[ch_node_id] = ch 
      item2node[ch_node_id].add_child(ch) 
      to_visit.append(ch_node) 
+3

Chào mừng bạn đến với Stack Overflow! Trong khi đoạn mã này được chào đón, và có thể cung cấp một số trợ giúp, nó sẽ được [cải thiện rất nhiều nếu nó bao gồm một lời giải thích] (// meta.stackexchange.com/q/114762) của * how * và * why * this giải quyết vấn đề . Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai, không chỉ là người hỏi ngay bây giờ! Vui lòng [sửa] câu trả lời của bạn để thêm giải thích và đưa ra chỉ dẫn về những giới hạn và giả định được áp dụng. –