An Introduction to Snap.py: SNAP for Python
1 SNAP简介
Stanford Network Analysis Platform (SNAP) 是斯坦福大学开发的一套专门用来分析和处理大型网络的平台。官网在这里:SNAP官网。
下面整理一些有用的链接:
snap.py 的资源
一些预制的包:http://snap.stanford.edu/snappy/index.html
snap.py的文档:http://snap.stanford.edu/snappy/doc/index.html
开发者资源:https://github.com/snap-stanford/snap-python
SNAP C++的资源
源码:http://snap.stanford.edu/snap/download.html
SNAP文档:http://snap.stanford.edu/snap/doc.html
开发者资源:https://github.com/snap-stanford/snap
关于数据集,SNAP也整理了许多有用的数据集以供使用。领域涵盖社交网络、推特和Memetracker、论文网络、合作网络和亚马逊商品网络等。数据集官网在这里:SNAP 数据集。
2 snap.py简介
snap.py(也叫snappy)是用python写的SNAP工具,与c++写的SNAP相比优势和劣势如下。
2.1 安装
如何下载snap.py呢?方法也非常简单,只需要一句:
pip install snap-stanford
针对不同系统的下载方式如下:
这样我们就将snap.py成功的下载,并且能够使用它了!使用的第一步是要将snap模块引入,通过:
$ python
>>> import snap
snap.py的功能涵盖以下内容。包括基本的数据处理、图和网络的构建、边和结点的遍历、保存和加载图数据和可视化等。
2.2 基础教程
snap.py的基本类型及命名规范如下。
(: 更多参考http://snap.stanford.edu/snappy/doc/reference/index-ref.html
- 基本类型。整型、浮点型、字符串。
import snap
i = snap.TInt(10) # 创建一个整型数字对象
j = snap.TFlt(4) # 创建一个浮点型数字对象
k = snap.TStr('hello') # 创建一个字符串对象
print(i.Val)
print(j.Val)
print(k.CStr())
10
4.0
hello
- 向量(Vector)。和STL中的Vector、以及Python的List操作都非常相似。
import snap
v = snap.TIntV() # 创建一个Int类型的向量
v.Add(1) # 添加元素
v.Add(2)
v.Add(3)
v.Add(4)
v.Add(5)
print(v.Len()) # 获取向量长度
print(v[3]) # 通过下标访问
v[3] = 2*v[2] # 修改值
print(v[3])
for item in v: # 迭代
print(item)
for i in range(0, v.Len()): # 迭代下标
print(i, v[i])
5
4
6
1
2
3
6
5
0 1
1 2
2 3
3 6
4 5
- 哈希表。类似于STL的map、以及python中的dict,以键值对的方式来存储值。
import snap
h = snap.TIntStrH() # 创建一个键为Int类型、值为Str字符串类型的Hash Table
h[5] = "apple" # 通过键值对的方式赋值
h[3] = "tomato"
h[9] = "orange"
h[6] = "banana"
h[1] = "apricot"
print(h.Len())
print("h[3] =", h[3]) # 修改值
h[3] = "peach"
print("h[3] =", h[3])
for key in h: # 迭代
print(key, h[key])
5
h[3] = tomato
h[3] = peach
5 apple
3 peach
9 orange
6 banana
1 apricot
其中介绍一个KeyID的概念,涉及到哈希表底层设计,对应哈希表中的唯一槽位。可能有多个值对应一个槽位,此时发生冲突。有很多办法来解决冲突,这是Snap帮我们做的工作,我们这里不需要知道,会用就行hh。
- Pair类型。类似于STL中的pair、python中的tuple,但是这里限制只能存两个数据。这两个数据可以是不同类型的。
import snap
p = snap.TIntStrPr(1, 'one')
print(p.GetVal1())
print(p.GetVal2())
1
one
这里的pair操作比较简单,它主要是和其他的类型结合起来使用。例如pair和vec结合,可以得到每个元素都为pair的一个向量,或者和hash table结合,得到键为pair而值为str的类型(如果pr仅指示了一个类型,那默认表明两个对象都是这个类型)。如下所示。
- 图的基本操作。首先图对象(或类)的命名规范如下所示。包含U的为无向图,T为类标识,P为对象标识。
- 下面是对图的一些基本方法的介绍。包括创建一个图、加入结点和边、遍历结点和边以及将图信息保存起来等。
'''
对graph的基本操作
'''
def graph_oper():
G1 = snap.TNGraph.New() # 创建一个新的图
G1.AddNode(1) # 先创建结点
G1.AddNode(5)
G1.AddNode(12)
G1.AddEdge(1, 5) # 再创建边
G1.AddEdge(5, 1)
G1.AddEdge(5, 12)
# 遍历结点
for NI in G1.Nodes():
print("node id %d, out-degree %d, in-degree %d" % (NI.GetId(), NI.GetOutDeg(), NI.GetInDeg()))
# 遍历边
for EI in G1.Edges():
print("(%d, %d)" % (EI.GetSrcNId(), EI.GetDstNId()))
# 遍历每个结点的相连的边
for NI in G1.Nodes():
print("Traverse %d's edges." % NI.GetId())
for DstNId in NI.GetOutEdges():
print("edge (%d %d)" % (NI.GetId(), DstNId))
snap.SaveEdgeList(G1, "data/G1_txt.txt", "List of edges") # 将graph信息保存为txt格式的文件
G2 = snap.LoadEdgeList(snap.PNGraph, "data/G1_txt.txt", 0, 1) # 0表示任一条边源结点的列数,1表示目的结点的列数
G2.Dump()
# 使用二进制保存更好
FOut = snap.TFOut("data/G1_bin.graph") # 将graph信息保存为二进制格式的文件
G1.Save(FOut)
FOut.Flush()
FIn = snap.TFIn("data/G1_bin.graph") # 读取
G3 = snap.TNGraph.Load(FIn)
G3.Dump()