Python无权点文件转化成邻接矩阵方式
目录
- 将无权点文件转化成邻接矩阵
- 邻接矩阵的COO格式
- 总结
将无权点文件转化成邻接矩阵
目前点文件是两列Excel代码,在进行复杂网络运算时http://www.devze.com需要转化成邻接矩阵。
我在网上找了一个代码,稍微修改了下,亲测可以成功转化。
import csv import numpy as np import pandas as pd import networkx as nx import matplotlib.pyplot as plt f = open('D:/ii/R/C3000.csv') #数据两列(id1,id2),每一行表示这两个节点之间存在边 data = [tuple(map(int, row)) for row in csv.reader(f)]#读取数据 n = max(max(id1, id2) for id1, id2 in data) javascriptprint(n)#最大节点数对应邻接矩阵的行列数 matrix = np.zeros((n,n))#生成n行n列的全0数组 for id1, id2 in data: mat开发者_Go开发rix[id2-1][id1-1]http://www.devze.com = 1#遍历数据,将对应关系转化为1 matrix[id1-1][id2-1] = 1 #邻接矩阵对角对称 print(matrix) df = pd.DataFrame(matrix) df.to_javascriptcsv("D:/ii/R/Adjacency Matrix.csv") #生成邻接矩阵并存储
转化成邻接矩阵后,python代码对于点的计算是从0开始的
邻接矩阵的COO格式
我们知道,邻接矩阵通常是稀疏矩阵,而COO格式(Coordinate Format)是稀疏矩阵的一种存储方式,本文将简要介绍如何将无权无向图的邻接矩阵转化为COO格式。
顾名思义,COO格式即坐标格式,我们只需考虑邻接矩阵中不为零的元素的坐标。对于无权无向图,其邻接矩阵是对称阵并且元素非 0 0 0 即 1 1 1,
考虑下面的邻接矩阵:
先考虑下三角部分,不为零的元素的坐标为(1,0),(2,1),(3,0),因此所有不为零的元素的坐标为(1,0),(0,1),(2,1),(1,2),(3,0),(0,3)。
将这六个坐标转http://www.devze.com置成列向量并沿列方向拼在一起即可得到此邻接矩阵的COO格式:
容易看出,对于无权无向图,设它有 num_edges 条边,则邻接矩阵的COO格式的形状为 (2, num_edges * 2)。
在 PyG 中,一条无向边被视为两条有向边的组合,COO格式中的 num_edges 指的是有向边的个数,因此这种情况下无论是有向图还是无向图,形状均可统一为 (2, num_edges)。
numpy 实现:
import numpy as np def adj2coo(adj): """Convert the adjacency matrix to its COO format Args: adj (ndarray): Adjacency matrix Returns: ndarray: COO format """ return np.vstack(adj.nonzero())
例如:
a = np.array([[0, 1, 0, 1], [1, 0, 1, 0], [0, 1, 0, 0], [1, 0, 0, 0]]) print(adj2coo(a)) # [[0 0 1 1 2 3] # [1 3 0 2 1 0]]
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。
精彩评论