相关文章推荐
小眼睛的跑步机  ·  宏伟精讲·linux ...·  1 年前    · 

1. SNAP简介

Stanford Network Analysis Platform (SNAP) 是一种用于大型网络分析和操作的通用、高性能系统。

官方文档: http://snap.stanford.edu/snappy/doc/reference/index-ref.html
Github项目地址: https://github.com/snap-stanford/snap-python

SNAP提供超过70个网络 数据集 ,包括:
在这里插入图片描述
snap.py的安装:

# for Windows
pip install snap-stanford

其他系统的安装方式可以看官网的介绍

2. snap中方法的一些命名惯例

3. 基本教程

教程官网
官方文档——官网的基本教程只是对一些基本操作进行了介绍,具体的一些函数和方法在官方文档中有比较详细的阐述。

3.1 基本类型

在snap中,有三个基本类型:
TInt:Integer
TFlt:Float
TStr:String

i = snap.TInt(10)
print(i.Val)
 

Note: do not use an empty string “”in TStr parameters

3.2 向量类型(Vector type)

Vector——Sequences of values of the same type
新的元素可以增加在队尾,同时支持可以访问和设置向量中元素的值。

在声明vecctor时,通常使用T<type_name>V。例如v = snap.TIntV()为声明一个数据类型为Int的向量。

# Create an empty vector创建一个空向量
v = snap.TIntV()
# Add elements 增加元素
v.Add(1)
v.Add(2)
v.Add(3)
v.Add(4)
v.Add(5)
# Print vector size 输出向量的维度
print(v.Len())
'''out:
# Get and set element value 可以访问和设置向量中元素的值
print(v[3])
'''out:
v[3] = 2 *v[2]
print(v[3])
'''out:
# print vector elements 输出向量的元素
for item in v:
    print(item)
'''out:
for i in range(0, v.Len()):
    print(i, v[i])
'''out:
 
 

一系列的键值对 (key, value) pairs
Keys必须为同一类型,values必须为同一类型,但是key和value可以为不同的数据类型。
支持增加新的(key, value)键值对
可以通过访问key来获取或者修改相应的value

在声明哈希表类型时,通常会使用T<key_type><value_type>H,例如TIntStrH就声明了一个哈希表,key的数据类型为Int,value的数据类型为Str

###### Hash Table Type
# Create an empty tatble
h = snap.TIntStrH()
# Add elements
h[5] = "apple"
h[3] = "tomato"
h[9] = "orange"
h[6] = "banana"
h[1] = "apricot"     
# print table size
print(h.Len()) 
'''out:
# Get element value
print("h[3]=", h[3])
'''out:
h[3]= tomato
# Set element value
h[3] = "peach"
print("h[3]=", h[3])
'''out:
h[3]= peach
# print table elements
for key in h:
    print(key, h[key])
'''out:
5 apple
3 peach
9 orange
6 banana
1 apricot

需要注意的是,在哈希表中,每个Key都有一个KeyId,Key是由用户创建的,KeyId是由程序自己分配的。例如在上面的表中,Key 3的KeyId是1,因为它是第二个键值。

# print KeyId
print(h.GetKeyId(3))
'''out:

3.4 Pair Type

(value1, value2)
value1的数据类型可以和value2的不一致。
可以访问两个value的值

在声明Pair类型时,通常会使用T<type1><type2>Pr,例如TIntStrPr就声明了一个Pair,第一个value的数据类型为Int,第二个value的数据类型为Str

###### Pair Type
# create a Pair
p = snap.TIntStrPr(1, "one")
# print pair values
print(p.GetVal1())
'''out:
print(p.GetVal2())
'''out:

Pair类型可以和Hash Table类型以及Vector类型进行组合:
在这里插入图片描述

3.5 图和网络类(Basic Graph and Network Classes)

TUNGraph:无向图
TNGraph:有向图
TNEANet:在节点和边上具有属性的多重图
在这里插入图片描述
在snap.py中,如果要使用图或者网络的具体实例,则要相对应地使用PUNGraphPNGraphPNEAnet

Snap.py does not directly use instances of the graph and network classes, but utilizes smart pointers to those instances instead. The actual instances in the Python program are of type PUNGraph, PNGraph, or PNEAnet and correspond to TUNGraph, TNGraph, and TNEAnet, respectively.
In general, if you need to call a class method, use T and if you need to specify an instance type, use P.

G1 = snap.TNGraph.New()
G2 = snap.GenRndGnm(snap.PNGraph, 100, 1000)
###### Graph Creation
# create directed graph
G1 = snap.TNGraph.New()
# Add nodes before adding edges
G1.AddNode(1)
G1.AddNode(5)
G1.AddNode(12)
G1.AddEdge(1,5)
G1.AddEdge(5,1)
G1.AddEdge(5,12)
# Create undirected graph, directed network
G2 = snap.TUNGraph.New()
N1 = snap.TNEANet.New()

遍历图中的节点和边:

###### Graph Traversal
# Traverse nodes
for NI in G1.Nodes():
    print("node id %d, out-degree %d, in-degree %d" % (NI.GetId(), NI.GetOutDeg(), NI.GetInDeg()))
'''out:
node id 1, out-degree 1, in-degree 1
node id 5, out-degree 2, in-degree 1
node id 12, out-degree 0, in-degree 1
# Traverse edges
for EI in G1.Edges():
    print("(%d, %d)" % (EI.GetSrcNId(), EI.GetDstNId()))
'''out:
(1, 5)
(5, 1)
(5, 12)
# Traverse edges by nodes
for NI in G1.Nodes():
    for DstNId in NI.GetOutEdges():
        print("edge (%d %d)" % (NI.GetId(), DstNId))
'''out:
edge (1 5)
edge (5 1)
edge (5 12)

图的存储和加载

###### Graph save and loading
# Save text
snap.SaveEdgeList(G1, "test.txt", "List of edges")
# Load text
G2 = snap.LoadEdgeList(snap.PNGraph,"test.txt",0,1)
# Save binary
FOut = snap.TFOut("test.graph")
G2.Save(FOut)
FOut.Flush()
# Load binary
FIn = snap.TFIn("test.graph")
G4 = snap.TNGraph.Load(FIn)

可以看到存储的text文件如下:
在这里插入图片描述

课程链接:CS224W: Machine Learning with Graphs课程视频:【课程】斯坦福 CS224W: 图机器学习 (2019 秋 | 英字)目录1. SNAP简介2. snap中方法的一些命名惯例3. 基本教程3.1 基本类型3.2 向量类型(Vector type)3.3 哈希表类型(Hash Table Type)3.4 Pair Type3.5 图和网络类(Basic Graph and Network Classes)1. SNAP简介Stanford Networ.
三角测量(triangulation), 就是在不同的姿态下观察同一个对象,根据像上的同名点的像素坐标,计算对象的三维坐标。 在双目视觉中,分左右相机,同时可以获得左视和右视,根据匹配的同名点和左右相机的投影矩阵,就可以计算出匹配同名点的世界坐标。 如: O1和O2相机的投影的像素点为p, p’;P为世界坐标点的齐次坐标。 首先对两个相机进行标定,并获得投影矩阵分别是T1 和 T2, T1和T2的大小为3x4的矩阵。 p=[uv1]p′=[u′v′1] p = \left[\begin{mat
Stanford Snap.py for Python学习记录如何下载安装新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特功能,丰富你的文章UML 表FLowchart流程导出与导入导出导入 如何下载安装 目前已经出到了2020年发布的6.0版本,下载安装使用的话可以直接在anaconda的
SNAP是一种用于分析和操纵大型网络的通用高性能系统。 SNAP是用C ++编写的,并针对最高性能和紧凑形表示进行了优化。 它可以轻松扩展到拥有数亿个节点和数十亿边缘的大型网络。 Snap.py提供了SNAP的性能优势,并结合了Python的灵活性。 大多数SNAP功能都可以通过Python中的Snap.py获得 笔者这里实践了相关API,并查看了其性能。具体解释看说明文档,其中 grap...
这个错误通常出现在使用 MyBatis 进行数据库操作时,表示 MyBatis 找不到 cellphone 属性对应的 TypeHandler。 解决方法是为 cellphone 属性指定一个合适的 TypeHandler。TypeHandler 是 MyBatis 中用于处理 Java 对象与数据库类型之间转换的组件。你需要自定义一个 TypeHandler,实现 Java 对象与数据库类型之间的转换,并在 MyBatis 配置文件中将其注册。 以下是一个简单的 TypeHandler 示例: ```java public class CellphoneTypeHandler extends BaseTypeHandler<String> { @Override public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, parameter); @Override public String getNullableResult(ResultSet rs, String columnName) throws SQLException { return rs.getString(columnName); @Override public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return rs.getString(columnIndex); @Override public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return cs.getString(columnIndex); 这个 TypeHandler 可以处理 String 类型的 cellphone 属性。在 MyBatis 配置文件中注册这个 TypeHandler: ```xml <typeHandlers> <typeHandler handler="com.example.CellphoneTypeHandler" javaType="java.lang.String"/> </typeHandlers> 注意要将 com.example.CellphoneTypeHandler 替换成你自定义的 TypeHandler 类的全限定名。此外,javaType 属性指定了该 TypeHandler 能够处理的 Java 类型,这里是 String。在你的实体类中,为 cellphone 属性加上 @TypeHandler 注解即可: ```java public class User { private Integer id; private String name; @TypeHandler(CellphoneTypeHandler.class) private String cellphone; // ... 这样 MyBatis 在操作数据库时就会使用你自定义的 TypeHandler 来处理 cellphone 属性了。

3.3 哈希表类型(Hash Table Type)