“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 Spinner选定值未上载到firebase数据库   java如何通过bukkit中的配置添加消息?   java在SharedReference中保存列表的泛型类型   javascript Java小程序未定义   swt在Java中构建控制台应用程序   java OAuth同意屏幕没有突然显示,没有错误?   java webview选择文件安卓不工作   java Spring boot JPA如何从同一连接添加多个数据库?   java JDBC DB2驱动程序计时器线程处于阻塞状态   java我在vscode中运行flatter时看到一个错误在phone中运行应用程序somone能否帮助我plz   Java:生成JSON:如何避免生成不完整的JSON   java Date compareTo()方法始终返回1   当使用Junit runner运行测试时,java Spring自动连线失败   java Android/Sockets如何将信息从主UI线程发送到socket线程?   java Android内存声明全局变量   java如何在JBoss中拥有多个具有相同JNDI名称的数据源?   python在Java中嵌入CPython时,为什么会挂起?   java如何提供深度模拟对象?   java“find:smallint,expected:integer”Hibernate对informix数据库的验证在短时间内失败