1. 根据列表 train_index \ test_index \ val_index ,将这个列表作为下标 传给train_mask \ test_mask \ val_mask ,使得对应列表中元素的内容赋值为True.
从而得到 train \ test \ val 的mask (以train_mask为例,最终得到的是一个numpy的一维向量,若节点是train节点,那么,该节点的对应位置值为True ; 否则为 False)
train_mask = np.zeros(num_nodes, dtype=np.bool)
val_mask = np.zeros(num_nodes, dtype=np.bool)
test_mask = np.zeros(num_nodes, dtype=np.bool)
train_mask[train_index] = True
val_mask[val_index] = True
test_mask[test_index] = True
2. 同1类似,也是将处理的数据的id列表作为下表给处,进行更改赋值:
x = np.array([ [1,2],[11,22],[111,222],[1111,2222],[11111,22222] ])
idx=[4,1,0]
idx_sorted=[0,3,4]
print(x)
print('--'*10)
x[idx]=x[idx_sorted]
print(x)
#输出:
[[ 1 2]
[ 11 22]
[ 111 222]
[ 1111 2222]
[11111 22222]]
--------------------
[[11111 22222]
[ 1111 2222]
[ 111 222]
[ 1111 2222]
[ 1 2]]
3. itertools.groupby()的操作:
朴素的itertools.groupby()含义是将一组字符串,相同的字符聚在一起,并返回这一组相同的字符组成的group含有多少个该字符
import itertools
m = itertools.groupby("anaalabbbjbchcccaaaak")
for k, v in m:
print(k,':', len(list(v)),end='\t')
#输出为:
a : 1 n : 1 a : 2 l : 1 a : 1 b : 3 j : 1 b : 1 c : 1 h : 1 c : 3 a : 4 k : 1
==》于是可以通过先将这些字符进行sorted()操作,将相同字符全部聚集到一起,然后就可以统计出整个字符串中有多少种字符以及他们对应的个数
如下述代码:
import itertools
m = itertools.groupby(sorted("anaalabbbjbchcccaaaak"))
for k, v in m:
print(k,':', len(list(v)),end='\t')
4. 构造出一个coo的稀疏矩阵:
使用scipy.sparse.coo_matrix()函数
该函数有三组参数:
scipy.sparse.coo_matrix( (value_list , (src_list , dst_list) ), shape=邻接矩阵的形状(dim=节点个数×节点个数) , dtype=邻接矩阵中各元素的值)
其中:src_list就是邻接矩阵的源点的列表;dst_list就是目的节点的列表;
value_list就是源点到目的节点的这条边上的对应值(如果就只是朴素的邻接矩阵,那就是graph上两个节点之间有边,那么对应位置处的value=1,否则值为0;但是,若graph是加权的图,那么两个节点有边对应的值就是权重)
使用方式:
import scipy.sparse #必须得import到sparse
edge = np.array([[0,0],[2,3],[3,5],[6,7],[32,22],[43,37]]) #节点编号从0开始
src_list = edge[:,0]
dst_list = edge[:,1]
num_nodes = 50
# 因为邻接矩阵有边值为1,每边值为0,所以邻接矩阵会有len(edge)个1
# scipy.sparse.coo_matrix( (value_list , (src_list , dst_list) ), shape=邻接矩阵的形状(dim=节点个数×节点个数) , dtype=邻接矩阵中各元素的值)
adjacency = scipy.sparse.coo_matrix((np.ones(len(edge)),
(src_list, dst_list)),
shape=(num_nodes, num_nodes), dtype="float32")
print(adjacency)
print( adjacency.toarray() ) #只有 .toarray 之后才可以输出为矩阵形式,不然只是adjacency 就是键值对
由于coo格式比较好构建,如果有存储需要的话,可以选择先将数据构建为COO格式,scipy上有特定的函数可以将其改造为CSC、CSR格式:调用to_csr()、to_csc()、to_dense()把它转换成CSR或稠密矩阵:
ref : https://blog.csdn.net/qq_37344125/article/details/105019357