开发者

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,

考虑下面的邻接矩阵:

Python无权点文件转化成邻接矩阵方式

先考虑下三角部分,不为零的元素的坐标为(1,0),(2,1),(3,0),因此所有不为零的元素的坐标为(1,0),(0,1),(2,1),(1,2),(3,0),(0,3)。

将这六个坐标转http://www.devze.com置成列向量并沿列方向拼在一起即可得到此邻接矩阵的COO格式:

Python无权点文件转化成邻接矩阵方式

容易看出,对于无权无向图,设它有 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]]

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新开发

开发排行榜