2012-02-20 10 views
5

У меня есть список векторов, созданных путем запуска:Конвертирование ndarray порождена hcluster в строку Newick для использования с ete2 пакета

import hcluster 
import numpy as np 
from ete2 import Tree 

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

где document_list представляет собой набор веб-документов, я анализирую. Затем я выполнить иерархическую кластеризацию:

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

Это создает ndarray, такие как:

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

Можно ли преобразовать этот ndarray в Newick строку, которая может быть передана в ete2 Tree() конструктор так что я могу рисовать и манипулировать новым деревом с помощью инструментов, предоставляемых ete2?

Есть ли смысл попробовать и сделать это, и если нет другого способа, которым я могу генерировать дерево/дендрограмму с использованием тех же данных и ete2 (я понимаю, что есть другие пакеты, которые могут рисовать дендрограммы, такие как дендропия и hcluster сам, но предпочли бы использовать ete2 все равно)?

Спасибо!

ответ

3

Я использую следующий подход для почти то же самое:

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

Упс, обратите внимание, что dist_matrix моя собственная функция для создания массива расстояния. Замените его на собственные значения (то есть vecs) – jhc

0

Update:

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

Добро пожаловать в переполнение стека! Хотя этот фрагмент кода приветствуется и может оказать некоторую помощь, было бы [значительно улучшено, если бы оно включало объяснение] (// meta.stackexchange.com/q/114762) * как * и * почему * это решает проблему , Помните, что вы отвечаете на вопрос читателей в будущем, а не только на человека, который спрашивает сейчас! Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение, и укажите, какие ограничения и допущения применяются. –

 Смежные вопросы

  • Нет связанных вопросов^_^