图与矩阵的转换

本部分内容的目的是使用networkx包与各种方式创建的矩阵之间实现相互转换:

矩阵转图

1.用numpy随机数矩阵产生图
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
# np.random.randint(low,high,size=(m,n))产生离散均匀分布的整数,整数属于[low,high);size部分表示m行n列矩阵
a=np.random.randint(0,2,size=(5,5))   #产生55列的随机整矩阵,因为要生成图,所以必须是方阵
G=nx.DiGraph(a)
print(a)
pos = nx.spring_layout(G)  # 指定了networkx上以中心放射状分布
nx.draw(G,pos,node_color = 'r',edge_color = 'b',with_labels = True,font_size =18,node_size =500)  #此处为绘制图的格式
plt.show(G)

结果:
[[0 0 1 0 1]
[0 1 1 0 0]
[0 0 1 1 0]
[1 0 1 1 0]
[1 1 1 1 1]]
生成的图片

2.用numpy数组或矩阵产生图
A=np.array([[1,1,3],[0,1,4],[0,0,2]])   #无向图,给出上三角矩阵数据即可,其他位置赋值无意义,可用np.matrix()
print(A)
G=nx.from_numpy_array(A)   #从数组取出元素生成图,可用nx.from_numpy_matrix()
G.edges(data=True)
print(nx.get_edge_attributes(G,'weight'))
print(G[2][1])

A:
[[1 1 3]
[0 1 4]
[0 0 2]]
{(0, 0): 1, (0, 1): 1, (0, 2): 3, (1, 1): 1, (1, 2): 4, (2, 2): 2}
{‘weight’: 4}

在这里插入图片描述

图转矩阵

1.自定义图转换为矩阵
G=nx.DiGraph()
elist = [('a', 'b', 5.0), ('b', 'c', 3.0), ('a', 'c', 1.0), ('c', 'd', 7.3)]
G.add_weighted_edges_from(elist)
A=nx.to_numpy_matrix(G)     #将图转换为矩阵,矩阵的数值为边的权重;也可以用nx.to_numpy_array(G),二者等价
print(A)

[[0. 5. 1. 0. ]
[0. 0. 3. 0. ]
[0. 0. 0. 7.3]
[0. 0. 0. 0. ]]
在这里插入图片描述

2.networkx自带图转换为矩阵
G=nx.krackhardt_kite_graph()  #风筝网络
A=nx.to_numpy_matrix(G)     #将图转换为矩阵,矩阵的数值为边的权重;默认边权重为1
print(A)

[[0. 1. 1. 1. 0. 1. 0. 0. 0. 0.]
[1. 0. 0. 1. 1. 0. 1. 0. 0. 0.]
[1. 0. 0. 1. 0. 1. 0. 0. 0. 0.]
[1. 1. 1. 0. 1. 1. 1. 0. 0. 0.]
[0. 1. 0. 1. 0. 0. 1. 0. 0. 0.]
[1. 0. 1. 1. 0. 0. 1. 1. 0. 0.]
[0. 1. 0. 1. 1. 1. 0. 1. 0. 0.]
[0. 0. 0. 0. 0. 1. 1. 0. 1. 0.]
[0. 0. 0. 0. 0. 0. 0. 1. 0. 1.]
[0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]]
在这里插入图片描述

3.图矩阵注意事项

图转矩阵过程中,图中节点只是一个标记,不要将图的标号理解成矩阵的下标,这样是错误的;如下程序中,应该将矩阵中的节点[2, 5, 3, 7, 4]依次对应成[0号元素,1号元素,2号元素,3号元素,4号元素],因此形成的矩阵为5行5列的方阵,非0元素为边的权重值。

G=nx.DiGraph()
G.add_weighted_edges_from([(2, 5, 0.3), (3, 7, 0.5), (4, 5, 0.2)])
print(G.edges(),G.nodes())
A=nx.to_numpy_matrix(G)
print(A)

结果为:
[(2, 5), (3, 7), (4, 5)] [2, 5, 3, 7, 4]
[[0. 0.3 0. 0. 0. ]
[0. 0. 0. 0. 0. ]
[0. 0. 0. 0.5 0. ]
[0. 0. 0. 0. 0. ]
[0. 0.2 0. 0. 0. ]]
若要根据读入数据对矩阵相应元素赋值,则可以用下面方式:

G=nx.DiGraph()
ma=0
with open('E:\\kx.txt') as f:
    for line in f:
        i, j ,k=line.split()
        u=int(i)
        v=int(j)
        G.add_edge(u, v)
        if ma< max(u,v):
            ma=max(u,v)
A=np.zeros((ma+1, ma+1))  #由读入元素中取出最大元素,构建全0方阵
print(A)
f.close()
with open('E:\\kx.txt') as f:
    for line in f:
        i, j, k = line.split()
        u = int(i)
        v = int(j)
        w=float(k)
        A[u][v]=w
print(A)
f.close()

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值