“pydot”上的一个简单的包装,它可以固定一些锋利的边缘

fastdot的Python项目详细描述


快速点

A simple wrapper over pydot to make it more consistent, unsurprising, and pythonic

承认:fastdot深受{a1}的影响,他基于他设计的高度灵活的数据结构构建了一个绘制图形的系统。在

安装

我们建议使用conda安装:conda install -c fastai fastdot。您也可以使用pip进行安装:pip install fastdot;但是,如果您使用这种方法,您还需要安装graphviz(例如使用aptbrew,等等)。在

概要

从表示对象和对象之间的连接的一些数据开始(例如,它们通常不是像本例中那样的字符串,而是神经网络层、用户和产品、或汽车旅行等):

layers1=['conv','conv','lin']layers2=['conv','lin']block1,block2=['block1','block2']conns=((block1,block2),(block1,layers2[-1]))

然后将它们直接映射到视觉效果:

^{pr2}$

svg

请参阅下面的符号图object graphs部分以获得更完整的示例。在

fastdot概述

fastdot是优秀的pydot程序之上的一个薄型包装器(它反过来又是绝对精彩的Graphviz software之上的一个薄型包装器),旨在使它更加一致、不令人惊讶和python。(删除shoppress的示例:pydot.Node('node')给出了一个模糊的编译异常,因为node是底层graphviz程序中的关键字,而{}由于自动引用而工作正常。)事实上,您永远不需要在fastdot中提供名称;您可以直接在对象之间创建边。在

下面是一些主要功能的快速示例:

g=Dot()c=Cluster('cl',fillcolor='pink')a1,a2,b=c.add_items('a','a','b')c.add_items(a1.connect(a2),a2.connect(b))g.add_item(Node('Check tooltip',tooltip="I have a tooltip!"))g.add_item(c)g

svg

如您所见,图形知道如何在Jupyter笔记本中直接显示自己,并且可以导出为HTML(它在幕后使用SVG)。工具提示出现在笔记本和导出的HTML页面中。默认情况下,具有相同标签的节点设置为相同的颜色。同样,如上所示,您可以使用add_item或{},而不考虑项目的类型。在

符号图

fastdot被特别设计成更容易以符号方式创建图形——例如,对于Python字典、PyTorch/TensorFlow模型等等。下面是一个简单的例子,其中包含一些模拟神经网络层和序列模型。首先,让我们定义我们的模拟类:

@dataclass(frozen=True)classLayer:name:str;n_filters:int=1classLinear(Layer):passclassConv2d(Layer):pass@dataclass(frozen=True)classSequential:layers:list;name:str

以下是我们的“模型”的顺序块:

block1=Sequential([Conv2d('conv',5),Linear('lin',3)],'block1')block2=Sequential([Conv2d('conv1',8),Conv2d('conv2',2),Linear('lin')],'block2')

fastdot可以直接从对象创建所有节点属性;您只需定义描述如何将对象属性映射到图形属性的函数。这些映射包含在node_defaultscluster_defaults字典中(尽管默认情况下标签是使用^{设置的,因此在本例中我们不需要任何特殊的集群默认值):

node_defaults['fillcolor']=lambdao:'greenyellow'ifisinstance(o,Linear)else'pink'cluster_defaults['label']=node_defaults['label']=attrgetter('name')node_defaults['tooltip']=str

有了它,我们可以直接从对象创建节点,例如使用方便的seq_cluster函数:

c1=seq_cluster(block1.layers,block1)c2=seq_cluster(block2.layers,block2)e1,e2=c1.connect(c2),c1.connect(c2.last())graph_items(c1,c2,e1,e2)

svg

注意,在这个例子中,我们甚至不需要单独创建Dot对象-graph_items直接从提供的图形项创建它。在

使用对象图

在上面的例子中,我们直接在fastdot对象之间定义了我们的边。但是,在实际操作中,很可能直接在python对象之间定义边,例如:

conns=((block1,block2),(block1,block2.layers[-1]),)

在本例中,您需要某种方法将python对象连接到表示它们的fastdot图形项。映射由fastdot自动存储,并通过object2graph函数提供:

g=graph_items(seq_cluster(block1.layers,block1),seq_cluster(block2.layers,block2))object2graph(block1.layers[-1])
<pydot.Node at 0x7f013180c310>

无需使用图形即可访问图形:

g.add_items(*[object2graph(a).connect(object2graph(b))fora,binconns])g

svg

有一个helper函数,object_connections,它为您创建这些连接。因此,上述内容可以简化为:

g=graph_items(seq_cluster(block1.layers,block1),seq_cluster(block2.layers,block2))g.add_items(*object_connections(conns))g

svg

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
在java代码中实现两个侦听器时发生swing错误   Lambda是否完全取消了Java8中匿名内部类的使用?   swing OpenSuse 12.3+Java双显示   POM中的java错误。xml文件,即使在清理{users}/之后。m2/用于*上次更新文件的存储库   JavaEDT特定的方法和其他东西   java如何使用GridLayout设置组件大小?有更好的办法吗?   java在itext7中生成二维码时,如何调整点的大小?   java如何在多行上显示文本并右对齐?   java在WebSphereCluString环境中分离Log4j日志   JAVA从文件读取,返回BigInteger值   当使用rxjava2进行排列时,使用javamockito。重试()   在java fasterxml中创建Xml   使用64位整数进行模运算的64位整数的java快速乘法,无溢出   java静态变量保留以前发布的值   datastax enterprise SSTable loader流式处理无法提供java。木卫一。IOException:对等方重置连接   java匹配的通配符是严格的,但找不到元素“mvc:annotationdriven”的声明。标准包装。可抛出   java无法在浏览器上下载文件文档?