0

我正在使用 Allen Brain 的鼠标RNA-seq 数据,并从提供的 dend.json 文件中创建一个字典,其中键是父节点,值是父节点拆分或导致的节点. 您可以在此处查看树状图。

加载 json 文件的字典如下所示:

{'node_attributes': [{'height': 0.8416,
   'members': 290,
   'edgePar.col': '#000000',
   'edgePar.lwd': 2,
   'edgePar.conf': 1,
   'label': '',
   'midpoint': 256.4472,
   'cell_set_accession': 'CS1910120323',
   'cell_set_alias': '',
   'cell_set_designation': 'Neuron/Non-Neuron',
   'X': '291',
   'node_id': 'n1'}],
 'children': [{'node_attributes': [{'height': 0.6271,
     'members': 279,
     'edgePar.col': '#000000',
     'edgePar.lwd': 2,
     'edgePar.conf': 1,
     'label': '',
     'midpoint': 226.7537,
     'cell_set_accession': 'CS1910120324',
     'cell_set_alias': '',
     'cell_set_designation': 'Neuron/Non-Neuron',
     'X': '292',
     'node_id': 'n2'}],
   'children': [{'node_attributes': [{'height': 0.365,
       'members': 271,
       'edgePar.col': '#000000',
       'edgePar.lwd': 2,
       'edgePar.conf': 1,
       'label': '',
       'midpoint': 178.695,
       'cell_set_accession': 'CS1910120325',
       'cell_set_alias': '',
       'cell_set_designation': 'Neuron 001-271',
       'X': '293',
       'node_id': 'n3'}],............

dictionary['children'][0]遵循左拆分,如果一个节点有两个拆分,则dictionary['children'][1]遵循右拆分。

我希望输出的形式类似于:

{n1 : [n2, n281],
 n2 : [n3, n284],...}

目前,我只能解析字典并使用改编自另一篇文章的代码返回节点:

def walk(d):

    for k,v in d.items():
        if isinstance(v, str) or isinstance(v, int) or isinstance(v, float):
            if k == 'node_id':
                print('node:', v)
        elif isinstance(v, list):
            for v_int in range(len(v)):
                walk(v[v_int])

walk(dend)

Output:
node: n1
node: n2
node: n3
node: n4
node: n183
node: n184
node: n185
4

1 回答 1

1

这可能接近您想要的。

https://github.com/danielsf/AllenInstTools_by_SFD/blob/master/parse_dendrogram.py

CellNode它为树状图中的每个节点创建一个类,该类存储节点的名称(the cell_set_accession),以及所有祖先、子代(直接子代)和最终子代(所有节点的后代)的名称列表。当前节点)在树中。该方法build_tree将返回一个以 为键的字典cell_set_accession,其值为CellNode该节点的 。

如果您不喜欢cell_set_accession用作节点的名称,可以在脚本的第 120 行更改它。

如果您想在您的 dict 中获得更多或更少的信息,您可以识别叶节点,因为它们将返回空列表node.children

代码对于我的目的来说已经足够好了(这是一种很好的说法,我没有严格测试它)。如果某些事情没有按预期工作,请随时与我们联系。

于 2020-03-12T18:44:52.240 回答