2012-02-20 7 views
5

Mam listę wektorów utworzonych przez uruchomienie:Konwertowanie ndarray generowane przez hcluster na sznurku Newick do użytku z ete2 pakietu

import hcluster 
import numpy as np 
from ete2 import Tree 

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

gdzie document_list jest zbiorem dokumentów internetowych mam analizujących. I następnie wykonać hierarchiczne grupowanie:

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

To generuje ndarray takich jak:

[[ 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.  ]] 

Czy to możliwe, aby przekształcić ten ndarray w Newick ciąg znaków, który może być przekazany do ete2 Drzewa() konstruktora tak że mogę rysować i manipulować drzewem drzewka przy użyciu narzędzi dostarczonych przez ete2?

Czy to ma sens, aby spróbować to zrobić, a jeśli nie, to jest inny sposób, w jaki mogę wygenerować drzewo/dendrogram używając tych samych danych i ete2 (zdaję sobie sprawę, że istnieją inne pakiety, które mogą narysować dendrogramy takie jak dendropy i sam hcluster, ale wolałby używać ete2 tak samo)?

Dzięki!

Odpowiedz

3

Używam następujące podejście do prawie to samo:

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

Ojej, trzeba pamiętać, że dist_matrix jest moja własna funkcja wygenerować macierz odległości. Zastąp go własnymi wartościami (np. Vecs). – jhc

0

Aktualizacja:

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

Witamy w Stack Overflow! Chociaż ten fragment kodu jest mile widziany i może zapewnić pomoc, byłoby [znacznie ulepszone, gdyby zawierał wyjaśnienie] (// meta.stackexchange.com/q/114762) * how * and * why * to rozwiązuje problem . Pamiętaj, że odpowiadasz na pytanie dla czytelników w przyszłości, a nie tylko pytasz teraz! Proszę [edytuj] swoją odpowiedź, aby dodać wyjaśnienie i podać, jakie ograniczenia i założenia mają zastosowanie. –

Powiązane problemy