NetworkX 使用(二)
%pylab inline
import networkx as nx
Populating the interactive namespace from numpy and matplotlib
# 创建一个空图
G = nx.Graph()
节点
G.add_node(1) # 添加一个节点
G.node
NodeView((1,))
G.add_nodes_from([2, 3]) # 添加多个节点
G.node
NodeView((1, 2, 3))
H 是一个有 \(10\) 个节点的链状图,即有 \(n\) 个节点 \(n-1\) 条边的连通图:
H = nx.path_graph(10)
nx.draw(H)
plt.show()

# 从 nbunch 中添加节点
G.add_nodes_from(H) # 或者 G.add_nodes_from(H.nodes())
G1 = nx.Graph()
G1.add_node(H) # 将 H 当作节点
nx.draw(G1) # 仅仅只有一个节点

现在图 G1 就包含了一个节点 H, 即该节点是一个图。可以看到这种灵活性是非常强大的,它允许图的图,文件的图,函数的图等等。因此我们应该好好思考如何构建我们的应用程序才能使我们的节点是有用的实体。当然我们可以在图中使用一个唯一的标识符或者使用一个不同的字典的键来标识节点信息。(如果该 hash 依赖于它的内容,则我们不应该改变节点对象)
nx.draw(G)

边
G = nx.Graph()
G.add_edge(1, 2) # 添加一条边
nx.draw(G)

等价于
e = (2, 3)
G.add_edge(*e)
nx.draw(G)

添加多条边
G.add_edges_from([(2, 4), (2, 1)])
nx.draw(G)

我们新添加节点和边时,NetworkX 会自动忽略掉已经存在的边和节点的添加:
G.add_edges_from(H.edges()) # 通过 ebunch 添加边
nx.draw(G)

我们可以用下列的方法拆除图:
G.remove_node(), G.remove_nodes_from(), G.remove_edge(), G.remove_edges_from()
G.remove_node(4)
nx.draw(G)

G.add_node("spam") # 添加节点"spam"
nx.draw(G)

G.add_nodes_from("spam") # 添加节点's' 'p' 'a' 'm'
nx.draw(G)

我们可以通过如下函数查看图的属性:
print('节点数', G.number_of_nodes())
print('边数', G.number_of_edges())
节点数 14
边数 7
print('节点列表', G.nodes())
print('边列表', G.edges())
print('节点 2 的邻居节点列表', list(G.neighbors(2)))
节点列表 [1, 2, 3, 0, 5, 6, 7, 8, 9, 'spam', 's', 'p', 'a', 'm']
边列表 [(1, 2), (1, 0), (2, 3), (5, 6), (6, 7), (7, 8), (8, 9)]
节点 2 的邻居节点列表 [1, 3]
下面的内容参考 What to use as nodes and edges
节点和边的使用
在 NetworkX 中节点和边并没有被指定一个对象,因此你就可以自由地指定节点和边的对象。最常见的对象是数值和字符串,但是一个节点可以是任意 hash对象(除了 None 对象),一条边也可以关联任意的对象x,比如:
G.add_edge(a,b,object=x):
举个关于边关联对象的例子,假如a 和 b 是两个人,而他们两个人之间的联系(边),可以是一个概率,即边的对象是一个概率值,表示这两个人之间每天通电话的可能性。
可以看到这是十分强大而且有用的,但是如果你滥用该方法将会导致意想不到的后果,除非你对 Python 真的很熟悉。如果你不是很确定,你可以考虑使用 conver_node_label_to_integers(),他可以将一个图的所有节点按顺序转化为整数对象赋给另一个图。
访问边
下面的是老版本的说法:
除了上面的提到的那些访问节点和边的方法以外( eg:
Graph.nodes(),Graph.edges(),Graph.neighbors()…),当你只是想想要遍历它们时,迭代的版本 (eg:Graph.edges_iter()) 可以省去返回它们时创建如此很大的一个表去存储它们。
实际上,新版的 NetworkX 已经将它们默认封装为了迭代器。
快速直接的访问图的数据结构可以通过下表来实现。
(注意:不要去改变返回的字典,因为它是图数据结构中的一部分,直接的操作可能导致图处于一个不一致的状态。)
G = nx.Graph()
G.add_edge(1, 2, length = 10)
G.add_edge(1, 3, weight = 20)
G.add_edge(2, 3, capacity = 15)
nx.draw(G)

print(G[1]) # Warning: do not change the resulting dict
{2: {'length': 10}, 3: {'weight': 20}}
print(G[1][12])
{'length': 10}
You can safely set the attributes of an edge using subscript notation if the edge already exists.
G.add_edge(1,4)
G[1][13]['color']='blue'
Fast examination of all edges is achieved using adjacency iterators. Note that for undirected graphs this actually looks at each edge twice.
add_weight_edges_from函数的作用是通过一个ebunch添加一些节点和边,边默认其属性为”weight”)
说明:其实adjacency()返回的是一个所有节点的二元组(node, adjacency dict)的迭代器
FG = nx.Graph()
FG.add_weighted_edges_from([(1,2,0.125),(1,3,0.75),(2,4,1.2),(3,4,0.375)])
nx.draw(FG)

for n, nbrs in FG.adjacency():
for nbr, eattr in nbrs.items():
data = eattr['weight']
if data < 0.5:
print('(%d, %d, %.3f)' % (n, nbr, data))
(1, 2, 0.125)
(2, 1, 0.125)
(3, 4, 0.375)
(4, 3, 0.375)
Convenient access to all edges is achieved with the edges method.
for (u,v,d) in FG.edges(data='weight'):
if d<0.5: print('(%d, %d, %.3f)'%(u,v,d))
(1, 2, 0.125)
(3, 4, 0.375)
NetworkX 使用(二)的更多相关文章
- Python可视化库
转自小小蒲公英原文用Python可视化库 现如今大数据已人尽皆知,但在这个信息大爆炸的时代里,空有海量数据是无实际使用价值,更不要说帮助管理者进行业务决策.那么数据有什么价值呢?用什么样的手段才能把数 ...
- NetworkX系列教程(10)-算法之二:最小/大生成树问题
小书匠 Graph 图论 重头戏部分来了,写到这里我感觉得仔细认真点了,可能在NetworkX中,实现某些算法就一句话的事,但是这个算法是做什么的,用在什么地方,原理是怎么样的,不清除,所以,我决定 ...
- 网络分析之networkx(转载)
图的类型 Graph类是无向图的基类,无向图能有自己的属性或参数,不包含重边,允许有回路,节点可以是任何hash的python对象,节点和边可以保存key/value属性对.该类的构造函数为Graph ...
- 【转】介绍几个图论和复杂网络的程序库 —— BGL,QuickGraph,igraph和NetworkX
原文来自:http://blog.sciencenet.cn/blog-404069-297233.html 作复杂网络研究离不开对各种实际或模拟网络的统计.计算.绘图等工作.对于一般性的工作,我们可 ...
- Social Network Analysis的Centrality总结,以及networkx实现EigenCentrality,PageRank和KatzCentrality的对比
本文主要总结近期学习的Social Network Analysis(SNA)中的各种Centrality度量,我暂且翻译为中心度.本文主要是实战,理论方面几乎没有,因为对于庞大的SNA,我可能连门都 ...
- Python 学习 第十六篇:networkx
networkx是Python的一个包,用于构建和操作复杂的图结构,提供分析图的算法.图是由顶点.边和可选的属性构成的数据结构,顶点表示数据,边是由两个顶点唯一确定的,表示两个顶点之间的关系.顶点和边 ...
- NetworkX 使用(三)
官方教程 博客:NetworkX NetworkX 使用(二) Introduction to Graph Analysis with NetworkX %pylab inline import ne ...
- python下的复杂网络编程包networkx的使用(摘抄)
原文:http://blog.sciencenet.cn/home.php?mod=space&uid=404069&do=blog&classid=141080&vi ...
- python3 networkx
一.networkx 1.用于图论和复杂网络 2.官网:http://networkx.github.io/ 3.networkx常常结合numpy等数据处理相关的库一起使用,通过matplot来可视 ...
随机推荐
- jQuery中下拉框select的操作方法详解
最近在写页面的时候常常遇到要动态增删改下拉框select的情况,由于我比较习惯用jquery框架来架构我的前端js,所以就顺便把各种jquery操作下拉框select的方法总结了一下,收藏起来以便下次 ...
- bzoj 5055: 膜法师——树状数组
Description 在经历过1e9次大型战争后的宇宙中现在还剩下n个完美维度, 现在来自多元宇宙的膜法师,想偷取其中的三个维度为伟大的长者续秒, 显然,他能为长者所续的时间,为这三个维度上能量的乘 ...
- 20145209 2016-2017-2 《Java程序设计》第7周学习总结
20145209 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 read()每次读入一个字节. eg:short2个字节,2=0x0201,读入后要0x & ...
- HTML5之2D物理引擎 Box2D for javascript Games 系列 翻外篇--如何结合createJS应用box2d.js
太久没有更新了,新年回来工作,突然有收到网友的邮件提问,居然还有人在关注,惭愧,找了下电脑上还有一点儿存着,顺便先发这一个番外篇吧,好歹可以看到真实的效果,等我考完英语,一定会更新下一章," ...
- 【SVN】centos环境下搭建SVN服务器
1.安装SVN,有些linux发行版自带SVN,可以用下面方法检测是否安装SVN. svn --version 如果 Subversion 客户端没有安装,命令将报告svn命令找不到的错误. 我们可以 ...
- plsql链接数据库配置
一. 目录结构 D:\install\PLSQL |-- instantclient_11_2 |-- tnsnames.ora |-- PLSQL ...
- perl6 Net::HTTP 不能发送https请求
如下命安装必要的包: sudo apt install libssl1.0.0 libssl-dev zef install IO::Socket::SSL zef install Net::HTTP
- SolrJ API 官方文档最佳实践
以下内容译自Solr Wiki官方文档,版权没有,随意转载. Solrj 是一个访问solr的Java客户端.它提供了一个java接口用于添加更新和查询solr索引.本页面介绍SolrJ最新版本1.4 ...
- MySQL字符集 GBK、GB2312、UTF8区别 解决 MYSQL中文乱码问题 收藏 MySQL中涉及的几个字符集
MySQL中涉及的几个字符集 character-set-server/default-character-set:服务器字符集,默认情况下所采用的.character-set-database:数据 ...
- 在JAVA中记录日志的十个小建议
JAVA日志管理既是一门科学,又是一门艺术.科学的部分是指了解写日志的工具以及其API,而选择日志的格式,消息的格式,日志记录的内容,哪种消息对应于哪一种日志级别,则完全是基于经验.从过去的实践证明, ...