【图神经网络】——“斯坦福CS224W”课程笔记(附1)

本文介绍了Stanford Network Analysis Platform (SNAP)的Python接口snap.py,包括安装、基本类型如整型、浮点型和字符串,以及向量、哈希表和Pair类型的操作。此外,还展示了图的创建、遍历和保存,为网络分析提供基础工具。
摘要由CSDN通过智能技术生成

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()
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唯与痴想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值