dot简介(一)

DOT语言又是啥子?

这个叫做地球的星球上,好像各种各样好的坏的莫名其妙的语言已经够多的了,还有无聊的家伙搞出来过一个莫名其妙的什么“干你脑”语言(BrainFuck),那叫一吐血,怎么现在又冒出来一个啥子语言?其实这个东西还真的挺有用的,它是一种绘制流程图的语言。废话少说,装上试试就知道了(下面命令只适用于Debian/Ubuntu系的Linux发行版操作系统,如使用其他操作系统,请到官网下载安装)。

sudo apt-get install graphviz 

不是说是DOT语言吗?怎么装了一个叫graphviz的东西?其实DOT语言就是GraphViz使用的流程描述语言。当然,graphviz也支持其他的几种图形描述语言,以生成更多种类的图形,当然,最常用的还是这个DOT语言。装好了后,就可以继续了。

用途说明

Graphviz (Graph Visualization Software的缩写)是一个由AT&T实验室启动的开源工具包,用于绘制DOT语言脚本描述的图形。它也提供了供其它软件使用的库。Graphviz是一个自由软件,其授权为Common Public License。其Mac版本曾经获得2004年的苹果设计奖。Graphviz包括很多命令行工具,dot命令是一个用来将生成的图形转换成多种输出格式的命令行工具,其输出格式包括PostScript,PDF,SVG,PNG,含注解的文本等等。neato命令用于spring model的生成(在Mac OS版本中称为energy minimized)。twopi命令用于放射状图形的生成。circo命令用于圆形图形的生成。fdp命令另一个用于生成无向图的工具。dotty命令一个用于可视化与修改图形的图形用户界面程序。lefty命令是一个可编程的(使用一种被EZ影响的语言[4])控件,它可以显示DOT图形,并允许用户用鼠标在图上执行操作。Lefty可以作为MVC模型的使用图形的GUI程序中的视图部分。 DOT语言是一种文本图形描述语言。它提供了一种简单的描述图形的方法,并且可以为人类和计算机程序所理解。DOT语言文件通常是具有.gv或是.dot的文件扩展名。本文将主要介绍从源代码安装Graphviz工具以及dot命令的使用方式。

常用参数

格式:dot -T<type> -o<outfile> <infile.dot>

输入文件是<infile.dot>,生成的格式由<type>指定,生成的文件是<outfile>。

 

其中-T<type>包括:

-Tps (PostScript),

-Tsvg -Tsvgz (Structured Vector Graphics), 

-Tfig (XFIG  graphics), 

-Tmif  (FrameMaker graphics),

-Thpgl (HP pen plotters),

-Tpcl (Laserjet printers),

-Tpng -Tgif (bitmap graphics),

-Tdia (GTK+ based diagrams),

-Timap (imagemap files for httpd servers for each node or edge  that  has a non-null "href" attribute.),

-Tcmapx (client-side imagemap for use in html and xhtml).

下面简单介绍下DOT语言的语法:

无向图 :在最简单的应用中,DOT语言可以用来描述一张无向图。无向图显示了对象间最简单的关系,例如人之间的友谊。使用关键字graph开始一张无向图的定义,并用大括号包含要描述的节点,双连字号(--)被用来描述节点间的关系。另外,一行的末尾需要加上分号(;)。
 graph graphname {
     a -- b -- c;
     b -- d;
 }

有向图 :类似于无向图,DOT语言也可以用来描述一张有向图,类似于流程图和树状图。其语法与无向图相似,但要在图的最开始使用关键字'digraph',并用箭头(->)表示节点直接的关系。
 digraph graphname {
     a -> b -> c;
     b -> d;
 }

属性 :

DOT语言中,可以对节点和边添加不同的属性。这些属性可以控制节点和边的显示样式,例如颜色,形状和线形。可以在语句和句尾的分号间放置一对方括号,并在其中中放置一个或多个属性-值对。多个属性可以被逗号和空格(, )分开。节点的属性被放置在只包含节点名称的表达式后。
 graph graphname {
     // label属性可以改变节点的显示名称
     a [label="Foo"];
     // 节点形状被改变了
     b [shape=box];
     // a-b边和b-c边有相同的属性
     a -- b -- c [color=blue];
     b -- d [style=dotted];
 }
注释 :

DOT语言支持C语言与C++风格的单行与多行注释。另外,也支持Shell脚本风格的以#开头的注释。
 // 单行注释
 /* 多行
    注
    释 */
 # 如此的行也会被忽略。

一段最基本的Dot

来个最基本的流程图,我们来看看这个语言到底有什么神奇之处?把下面的代码随便用任何一款文本编辑器,保存为test.dot文件。

digraph G {     a -> b -> c -> a; } 

然后,在这个文件的目录中:

$ dot -Tpng test.dot -o test.png 

现在,用看图软件,看一下生成的test.png文件,是不是很神奇?

DOT语言能可视化编辑吗?

目前尚未找到好的DOT可视化编辑器,似乎也没这个必要。当然,可预览编辑还是有的。可以用vimdot命令。如我们编辑上面的test.dot文件,就可以用下面的命令:

$ vimdot test.dot 

它会同时打开两个窗口,一个是vim,另一个就是graphviz的预览窗口,当你在vim中编辑dot代码完毕,存盘后,预览窗口就会更新显示出该dot文件的生成结果。

dot

就这么简单?

当然不是,如果要复杂,DOT语言可以十分复杂,当然,我们大部分情况下是根本不需要那么多复杂的功能的。在后面的笔记中,会逐步介绍我经常用到的各种常用的DOT语言属性。比方说生成如下图这样的:

DOT

源码安装:
http://codingstandards.iteye.com/blog/840055

问题思考

相关资料

【1】维基百科   Graphviz    

【2】维基百科   DOT语言

【3】啄木鸟社区  Graphviz

【4】age的个人空间  用Dot绘图

【5】海贼’blog   linux dot 绘图

【6】daxuxu   graphviz dot简介

【7】openstudy  英文版linux安装中文字体

 

返回 我使用过的Linux命令系列总目录



### Numpy Dot 函数简介 `numpy.dot()` 是 NumPy 库中的个重要函数,用于计算两个数组之间的点积(dot product)。对于维数组来说,它相当于向量的内积;而对于二维或多维数组,则可以看作矩阵乘法的部分。 以下是 `numpy.dot()` 的基本语法: ```python import numpy as np result = np.dot(a, b) ``` 其中,`a` 和 `b` 可以是维或更高维度的数组。具体行为取决于输入数组的形状和维度[^1]。 --- ### 对于不同维度的情况 #### 1. **维数组** 当 `a` 和 `b` 都是维数组时,`np.dot(a, b)` 计算的是它们的内积,即对应位置元素相乘后再求和的结果。 示例代码如下: ```python a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) result = np.dot(a, b) print(result) # 输出:32 (因为 1*4 + 2*5 + 3*6 = 32) ``` #### 2. **二维数组(矩阵)** 如果 `a` 和 `b` 是二维数组,则 `np.dot(a, b)` 执行标准的矩阵乘法操作。需要注意的是,只有在第个矩阵的列数等于第二个矩阵的行数时才能进行此运算。 示例代码如下: ```python a = np.array([[1, 2], [3, 4]]) b = np.array([[5, 6], [7, 8]]) result = np.dot(a, b) print(result) # 输出: # [[19 22] # [43 50]] ``` 这里的结果可以通过手动验证得出: - 左上角元素为 \(1 \times 5 + 2 \times 7 = 19\); - 右下角元素为 \(3 \times 8 + 4 \times 7 = 50\)。 #### 3. **多维数组** 对于超过两维的数组,`np.dot()` 将其视为堆叠的矩阵集合并执行批量矩阵乘法。这种情况下,最后个轴作为第矩阵的“行”,倒数第二轴作为第二矩阵的“列”。 示例代码如下: ```python a = np.random.rand(2, 3, 4) # 形状为 (2, 3, 4) b = np.random.rand(2, 4, 5) # 形状为 (2, 4, 5) result = np.dot(a, b) print(result.shape) # 输出:(2, 3, 5),表示进行了批量矩阵乘法。 ``` --- ### 性能优化提示 由于 NumPy 基于 C 实现,因此它的性能通常优于纯 Python 循环实现。然而,在处理大规模数据集时,仍需注意内存占用情况以及可能存在的数值溢出问题[^2]。 此外,还可以利用其他线性代数专用模块来进步提升效率,比如 SciPy 提供的功能更强大的替代方法。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值