首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python:在networkX中查找输出路径的输入

python:在networkX中查找输出路径的输入
EN

Stack Overflow用户
提问于 2017-08-03 16:33:42
回答 1查看 335关注 0票数 0

编辑:现在看看如何计算每个节点“循环路径”的#。

正如标题所述,我正在尝试创建一个计算网络中任何节点的“信号路径”数量的函数。节点的信号路径是从多个输入中的一个到节点是其一部分的多个输出之一的路径。我正在使用一种已经被称为路径的算法,它是一个生成器,它将从输入返回到输出的每条路径返回。

然而,尽管我的代码看起来是正确的,但我得到了不正确的结果。以下是功能:

代码语言:javascript
复制
def signal_path_counter(G, inputs, outputs, node):
    c = 0
    paths = []
    for out in outputs:
        for i in inputs:
            for path in all_simple_paths(G, i, out):
                paths.append(path)
    for path in paths:
        for n in path:
            if(node == n):
                c += 1
    return c

以下是输入的数据:

代码语言:javascript
复制
import networkx as nx
import matplotlib.pyplot as plt
G=nx.DiGraph()
molecules = ["CD40L", "CD40", "NF-kB", "XBP1", "Pax5", "Bach2", "Irf4", "IL-4", "IL-4R", "STAT6", "AID", "Blimp1", "Bcl6", "ERK", "BCR", "STAT3", "Ag", "STAT5", "IL-21R", "IL-21", "IL-2", "IL-2R"]
Bcl6 = [("Bcl6", "Bcl6"), ("Bcl6", "Blimp1"), ("Bcl6", "Irf4")]
STAT5 = [("STAT5", "Bcl6")]
IL_2R = [("IL-2R", "STAT5")]
IL_2 = [("IL-22", "IL-2R")]
BCR = [("BCR", "ERK")]
Ag = [("Ag", "BCR")]
CD40L = [("CD40L", "CD40")]
CD40 = [("CD40", "NF-B")]
NF_B = [("NF-B", "Irf4"), ("NF-B", "AID")]
Irf4 = [("Irf4", "Bcl6"), ("Irf4", "Pax5"), ("Irf4", "Irf4"), ("Irf4", "Blimp1")]
ERK = [("ERK", "Bcl6"), ("ERK", "Blimp1"), ("ERK", "Pax5")]
STAT3 = [("STAT3", "Blimp1")]
IL_21 = [("IL-21", "IL-21R")]
IL_21R = [("IL-21R", "STAT3")]
IL_4R = [("IL-4R", "STAT6")]
STAT6 = [("STAT6", "AID"), ("STAT6", "Bcl6")]
Bach2 = [("Bach2", "Blimp1")]
IL_4 = [("IL-4", "IL-4R")]
Blimp1 = [("Blimp1", "Bcl6"), ("Blimp1", "Bach2"), ("Blimp1", "Pax5"), ("Blimp1", "AID"), ("Blimp1", "Irf4")]
Pax5 = [("Pax5", "Pax5"), ("Pax5", "AID"), ("Pax5", "Bcl6"), ("Pax5", "Bach2"), ("Pax5", "XBP1"), ("Pax5", "ERK"), ("Pax5", "Blimp1")]
edges = Bcl6 + STAT5 + IL_2R + IL_2 + BCR + Ag + CD40L + CD40 + NF_B + Irf4 + 
ERK + STAT3 + IL_21 + IL_21R + IL_4R + STAT6 + Bach2 + IL_4 + Blimp1 + Pax5
G.add_nodes_from(molecules)
G.add_edges_from(edges)
sources = ["Ag", "CD40L", "IL-2", "IL-21", "IL-4"]
targets = ["XBP1", "AID"]

输入网络这里的可视化表示。

给出0的不正确结果的函数调用:

代码语言:javascript
复制
print(signal_path_counter(G, sources, targets, "IL-2R"))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-03 18:21:02

您的错误在这一行:

代码语言:javascript
复制
IL_2 = [("IL-22", "IL-2R")]

它应该是

代码语言:javascript
复制
IL_2 = [("IL-2", "IL-2R")]

有一些事情可以用你的代码来做,使它更“节奏曲”。可以使用这种方法更干净地迭代多个组合,这将在outi上用

代码语言:javascript
复制
for input, output in itertools.product(inputs, outputs):
    for path in all_simple_paths(G, input, output):
        paths.append(...)

另外,与其构建路径,然后遍历paths来测试节点是否在其中,不如直接进行测试,而不是附加到paths中。

代码语言:javascript
复制
for input, output in itertools.product(inputs, outputs):
    for path in all_simple_paths(G, input, output):
        if node in path:
            c += 1

即使对于这段代码,我也认为使用Counter可以使其变得更干净。基本上,如果您正在执行variable += 1,或者在迭代时将元素添加到列表中,那么通常有一种“更仿生”的方法。

我担心这个算法在更大的网络中的扩展效果如何。找到所有的路都是昂贵的。最好从node开始,构建从nodeoutputs的所有路径,以及从inputsnode的所有路径。然后将每条路径转换成一个集合,转换为集合使下一步更快。然后穿过进进出出的道路,看看它们是否有任何交叉口。如果不是,那么您就有了一条通过node的路径。

这将大大减少您最终不得不考虑的路径数(很可能还会减少路径的长度)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45489963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档