%pylab inline
import networkx as nx
Populating the interactive namespace from numpy and matplotlib
G = nx.Graph()
G.add_node(1)
G.add_nodes_from([2,3])
G.add_edge(1,2)
e = (2,3)
G.add_edge(*e) # Unpacking tuple
G.add_edges_from([(1,2),(1,3)])
nx.draw(G)

print(G.number_of_nodes())
print(G.number_of_edges())
3
3
G[1]
AtlasView({2: {}, 3: {}})
G[1][2]['weight'] = 10
G[1]
AtlasView({2: {'weight': 10}, 3: {}})
FG = nx.Graph()
FG.add_weighted_edges_from([(1,2,0.125),(1,3,0.75),(2,4,1.2),(3,4,0.375)])
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)
print(list(FG.adjacency()))
type(FG.adjacency())
[(1, {2: {'weight': 0.125}, 3: {'weight': 0.75}}), (2, {1: {'weight': 0.125}, 4: {'weight': 1.2}}), (3, {1: {'weight': 0.75}, 4: {'weight': 0.375}}), (4, {2: {'weight': 1.2}, 3: {'weight': 0.375}})]

dict_itemiterator
# 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)'%(n,nbr,d))
(4, 3, 0.125)
(4, 3, 0.375)

添加 graphs, nodes, 和 edges 的属性

属性 (Attributes) 有 weights, labels, colors, 或者你喜欢的如何 Python 对象均可添加到 graphs, nodes, 或者 edges 中.

Each graph, node, and edge can hold key/value attribute pairs in an associated attribute dictionary (the keys must be hashable). By default these are empty, but attributes can be added or changed using add_edge, add_node or direct manipulation of the attribute dictionaries named G.graph, G.node and G.edge for a graph G.

Graph 属性

在创建新图的时候分配图属性.

G = nx.Graph(day="Friday")
G.graph
{'day': 'Friday'}

或者,你可以在之后修改:

G.graph['day']='Monday'
G.graph
{'day': 'Monday'}

Node 属性

使用 add_node(), add_nodes_from() 或者 G.node 添加节点属性.

G.add_node(1, time = '5pm')
G.node[1]
{'time': '5pm'}
G.add_nodes_from([3], time='2pm')
G.node[3]
{'time': '2pm'}
G.node[1]['room'] = 714
G.node[1]
{'time': '5pm', 'room': 714}
G.nodes(data=True)
NodeDataView({1: {'time': '5pm', 'room': 714}, 3: {'time': '2pm'}})

Note that adding a node to G.node does not add it to the graph, use G.add_node() to add new nodes.

Edge 属性

使用 add_edge(), add_edges_from(), subscript notation(下标注释), 或者 G.edge 添加边属性.

G.add_edge(1, 2, weight=4.7 )
G[1][2]
{'weight': 4.7}
G.add_edges_from([(3,4),(4,5)], color='red')
G.add_edges_from([(1,2,{'color':'blue'}), (2,3,{'weight':8})])
G[1][2]['weight'] = 4.7
G.edges(data=True)
EdgeDataView([(1, 2, {'weight': 4.7, 'color': 'blue'}), (3, 4, {'color': 'red'}), (3, 2, {'weight': 8}), (4, 5, {'color': 'red'})])

转换图为邻接矩阵

你可以使用 nx.to_numpy_matrix(G)G 转换为 numpy 矩阵. 如果是加权图,则矩阵的元素是权重值. 如果边不存在,其值则设置为 \(0\) 而不是 Infinity(无穷大). You have to manually modify those values to Infinity (float('inf'))

nx.to_numpy_matrix(G)
matrix([[0. , 0. , 4.7, 0. , 0. ],
[0. , 0. , 8. , 1. , 0. ],
[4.7, 8. , 0. , 0. , 0. ],
[0. , 1. , 0. , 0. , 1. ],
[0. , 0. , 0. , 1. , 0. ]])
nx.to_numpy_matrix(FG)
matrix([[0.   , 0.125, 0.75 , 0.   ],
[0.125, 0. , 0. , 1.2 ],
[0.75 , 0. , 0. , 0.375],
[0. , 1.2 , 0.375, 0. ]])

有向图

DiGraph 类提供了许多有向图中的额外算法,比如 DiGraph.out_edges(), DiGraph.in_degree(), DiGraph.predecessors(), DiGraph.successors()等。为了让算法可以在两类图中都可以工作,无向图中的 neighbors()degree() 分别等价于有向图中的 successors()和有向图中的 in_degree()out_degree() 的和.

DG = nx.DiGraph()
DG.add_weighted_edges_from([(1, 2, 0.5), (1, 3, 1.1), (4, 1, 2.3)])
DG.out_degree(1) # 节点 1 的出度
2
DG.out_degree(1, weight='weight')  # 节点 1 的所有出度的权值之和
1.6
list(DG.successors(1)) # 节点 1 的继承者
[2, 3]
list(DG.neighbors(1)) # 节点 1 的邻居(不包括指向节点 1 的节点)
[2, 3]

有向图与无向图的转换

H = DG.to_undirected()
# 或者
H = nx.Graph(DG)

多图(Multigraphs)

NetworkX 提供了一个类,它可以允许任何一对节点之间有多条边。类 MultiGraph 和类 MultiDiGraph 允许添加相同的边两次,这两条边可能附带不同的权值。对于有些应用程序这是非常有用的类,但是许多算法不能够很好的在这样的图中定义,比如最短路径算法,但是像 MultiGraph.degree 这种算法又可以很好的被定义。否则你应该为了很好的定义测量,而将图转化为标准的图。

MG = nx.MultiGraph()
MG.add_weighted_edges_from([(1, 2, 0.5), (1, 2, 0.75), (2, 3, 0.5)])
dict(MG.degree(weight='weight')) GG = nx.Graph()
for n, nbrs in MG.adjacency():
for nbr, edict in nbrs.items():
minvalue = min([d['weight'] for d in edict.values()])
GG.add_edge(n, nbr, weight=minvalue) nx.shortest_path(GG, 1, 3)
[1, 2, 3]

图的生成器和图的操作

除了通过节点和边生成图,也可以通过以下方法产生:

使用典型的图形操作:

  • subgraph(G, nbunch) - 产生 nbunch 节点的子图
  • union(G1,G2) - 结合图
  • disjoint_union(G1,G2) - 假设所有节点都不同,然后结合图
  • cartesian_product(G1,G2) - 返回笛卡尔乘积图
  • compose(G1,G2) - 结合两个图并表示两者共同的节点
  • complement(G) - 图 G 的补图
  • create_empty_copy(G) - 返回同一类图的无边副本
  • convert_to_undirected(G) - 返回 G 的无向图
  • convert_to_directed(G) - 返回G的有向图

调用经典的小图

petersen = nx.petersen_graph()

tutte = nx.tutte_graph()

maze = nx.sedgewick_maze_graph()

tet = nx.tetrahedral_graph()

使用一些图形生成器

K_5 = nx.complete_graph(5)

K_3_5 = nx.complete_bipartite_graph(3, 5)

barbell = nx.barbell_graph(10, 10)

lollipop = nx.lollipop_graph(10, 20)

使用随机图发生器

er = nx.erdos_renyi_graph(100, 0.15)

ws = nx.watts_strogatz_graph(30, 3, 0.1)

ba = nx.barabasi_albert_graph(100, 5)

red = nx.random_lobster(100, 0.9, 0.9)

通过读取存储在文件中的一些标准图形格式,例如边表,邻接表,GML,GraphML,pickle,LEAD或者其他的一些格式:

nx.write_gml(red,"path.to.file")

mygraph=nx.read_gml("path.to.file")

分析图

图 G 的结构可以通过各种图论的函数来分析,例如:

G = nx.Graph()
G.add_edges_from([(1, 2), (1, 3)])
G.add_node("spam") # adds node "spam"
list(nx.connected_components(G))
[{1, 2, 3}, {'spam'}]
sorted(d for n, d in G.degree())
[0, 1, 1, 2]
nx.clustering(G)
{1: 0, 2: 0, 3: 0, 'spam': 0}

返回节点属性的函数是通过返回一个以节点为键的字典来实现的:

nx.degree(G)
DegreeView({1: 2, 2: 1, 3: 1, 'spam': 0})

图算法:Algorithms

NetworkX 使用(三)的更多相关文章

  1. python下的复杂网络编程包networkx的使用(摘抄)

    原文:http://blog.sciencenet.cn/home.php?mod=space&uid=404069&do=blog&classid=141080&vi ...

  2. 网络分析之networkx(转载)

    图的类型 Graph类是无向图的基类,无向图能有自己的属性或参数,不包含重边,允许有回路,节点可以是任何hash的python对象,节点和边可以保存key/value属性对.该类的构造函数为Graph ...

  3. [译]学习IPython进行交互式计算和数据可视化(三)

    第二章 在本章中,我们将详细学习IPython相对以Python控制台带来的多种改进.特别的,我们将会进行下面的几个任务: 从IPython中使用系统shell以在shell和Python之间进行强大 ...

  4. 【转】介绍几个图论和复杂网络的程序库 —— BGL,QuickGraph,igraph和NetworkX

    原文来自:http://blog.sciencenet.cn/blog-404069-297233.html 作复杂网络研究离不开对各种实际或模拟网络的统计.计算.绘图等工作.对于一般性的工作,我们可 ...

  5. Social Network Analysis的Centrality总结,以及networkx实现EigenCentrality,PageRank和KatzCentrality的对比

    本文主要总结近期学习的Social Network Analysis(SNA)中的各种Centrality度量,我暂且翻译为中心度.本文主要是实战,理论方面几乎没有,因为对于庞大的SNA,我可能连门都 ...

  6. Python 学习 第十六篇:networkx

    networkx是Python的一个包,用于构建和操作复杂的图结构,提供分析图的算法.图是由顶点.边和可选的属性构成的数据结构,顶点表示数据,边是由两个顶点唯一确定的,表示两个顶点之间的关系.顶点和边 ...

  7. NetworkX

    常用网站: 官方文档 Github (latest development) NetworkX官方介绍: ======== NetworkX (NX) is a Python package for ...

  8. networkX用法整

    无向图,有向图,加权图等例子代码 [http://www.cnblogs.com/kaituorensheng/p/5423131.html#_label1] 数据分析学习笔记(三)-NetworkX ...

  9. python3 networkx

    一.networkx 1.用于图论和复杂网络 2.官网:http://networkx.github.io/ 3.networkx常常结合numpy等数据处理相关的库一起使用,通过matplot来可视 ...

随机推荐

  1. 《设计模式》-原则二:里氏代换原则(LSP)

    回顾一下上一节说的“开闭原则” 说的是 一个软件要遵循对修改关闭 对新功能扩展的原则. 这一次来说说 “里氏代换原则” 意思是说:子类型必须能代替他们的基类. 看了半天的例子 好像 是懂非懂啊...相 ...

  2. [整理]VS2010中如何添加“依赖","库目录","包含目录"

    VS2010中如何添加“依赖","库目录","包含目录" 1. 添加编译所需要(依赖)的 lib 文件[解决方案资源管理器]“项目->属性-&g ...

  3. 解决IE6中 PNG图片透明的终极方案-八种方案!

    “珍惜生命,远离IE6”,IE6中的bug令很多Web前端开发人员实为头疼,因此不知道烧了多少脑细胞,在众多的Bug中最令人抓狂的就是IE对png图片的不支持,导致设计师和重构师放弃了很多很炫的效果, ...

  4. 【BZOJ】2208 [Jsoi2010]连通数

    [题意]给定n个点的有向图,求可达点对数(互相可达算两对,含自身).n<=2000. [算法]强连通分量(tarjan)+拓扑排序+状态压缩(bitset) [题解]这题可以说非常经典了. 1. ...

  5. 20155310 2016-2017-2 《Java程序设计》第六周学习总结

    20155310 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 4.1 Y86指令集体系结构 •有8个程序寄存器:%eax.%ecx.%edx.%ebx.% ...

  6. 【leetcode 简单】 第八十八题 猜数字大小

    我们正在玩一个猜数字游戏. 游戏规则如下: 我从 1 到 n 选择一个数字. 你需要猜我选择了哪个数字. 每次你猜错了,我会告诉你这个数字是大了还是小了. 你调用一个预先定义好的接口 guess(in ...

  7. 【leetcode 简单】 第八十五题 两个数组的交集 II

    给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = [4,9,5 ...

  8. ES6的优雅方法

    1.箭头函数 // ES5 var selected = allJobs.filter(function (job) { return job.isSelected(); }); // ES6 var ...

  9. Linux/Unix系统编程手册 第二章:基本概念

    本章预热与后续系统编程有关的概念. 术语“操作系统”通常包含2种含义:一是指完整的软件包,包括管理计算机资源的核心组件,已经附带的标准软件:二是独指管理硬件的内核. 内核具有诸多概功能,包括: 进程管 ...

  10. Dream------scala--scala内部类实战

    Dream------scala--scala内部类实战 scala的内部类跟java的内部类有很大的不同,java中的内部类实际上是从属于外部类,而scala的内部类是从属于外部类对象的(及外部类实 ...