nx.adjacency_matrix计算邻接矩阵与真实结果不一致:解决办法记录

  • 问题描述
    • 原来的代码
    • 实际运行输出
    • 理论结果
  • 调试过程
  • 解决方案
    • 修改后的代码
    • 修改代码后的运行结果
    • 函数说明

问题描述

我自己根据edgelist计算的邻接矩阵,与调用networkx.adjacency_matrix(g)返回的结果不一样,经过调试发现了问题原因以及解决办法,记录如下。

原来的代码

edgelist = [(0, 1),(1, 3),(2, 4),(1, 5),(1, 3),(5, 5),(1, 3)]
"""由于nx.MultiGraph()可累计多条重复边作为权重,所以(1,3)出现3次权重是3"""
g = nx.MultiGraph()  # 无向多边图
g.add_edges_from(edgelist)
adj = sp.lil_matrix(nx.adjacency_matrix(g))
print(adj.todense())

实际运行输出

[[0 1 0 0 0 0][1 0 3 0 0 1][0 3 0 0 0 0][0 0 0 0 1 0][0 0 0 1 0 0][0 1 0 0 0 1]]

理论结果

[[0 1 0 0 0 0][1 0 0 3 0 1][0 0 0 0 1 0][0 3 0 0 0 0][0 0 1 0 0 0][0 1 0 0 0 1]]

节点id从0开始。对于边(1,3),矩阵的第二行第四列应当为权重3,可以看到实际运行输出结果中,3却出现在了第二行第三列!

调试过程

查看了networkx.adjacency_matrix()的源代码,其中有一条说明如下:

def adjacency_matrix(G, nodelist=None, weight='weight'):"""Return adjacency matrix of G.Parameters----------G : graphA NetworkX graphnodelist : list, optionalThe rows and columns are ordered according to the nodes in nodelist.If nodelist is None, then the ordering is produced by G.nodes().weight : string or None, optional (default='weight')The edge data key used to provide each value in the matrix.If None, then each edge has weight 1......."""return nx.to_scipy_sparse_matrix(G, nodelist=nodelist, weight=weight)

第二个参数的说明需要格外注意!对于nodelist这个参数,说明是这样的:邻接矩阵的行和列的排序按照nodelist中节点顺序来!如果不传这个参数,默认是按照传进来的图G调用G.nodes()时返回的节点的顺序!
所以我查看了我传进去的图g的节点默认顺序是什么样的:

edgelist = [(0, 1),(1, 3),(2, 4),(1, 5),(1, 3),(5, 5),(1, 3)]
"""由于nx.MultiGraph()可累计多条重复边作为权重,所以(1,3)出现3次权重是3"""
g = nx.MultiGraph()  # 无向多边图
g.add_edges_from(edgelist)
print(g.nodes())
adj = sp.lil_matrix(nx.adjacency_matrix(g))
print(adj.todense())

运行结果居然:

[0, 1, 3, 2, 4, 5]
[[0 1 0 0 0 0][1 0 3 0 0 1][0 3 0 0 0 0][0 0 0 0 1 0][0 0 0 1 0 0][0 1 0 0 0 1]]

图g的节点列表居然不是按照从小到大的顺序排列,id为3的节点居然是第三而不是第四位序,这就是为什么边(1,3)的权重会写在矩阵的第三列…因为矩阵第三列对应节点3!

那…为什么图g的节点列表不是排好序的,为什么是[0, 1, 3, 2, 4, 5]这个顺序?

因为:加新边sdd_edges的时候会自动加新节点!!!

边(0,1)加进去的时候,节点列表是[0,1];加边(1, 3)的时候,节点列表[0,1,3];…。所以节点默认列表的顺序,跟你加新边时候哪个节点先出现有关系。

解决方案

那么在添加新边之前,先把节点按id从小到大顺序排好同意添加,就可以了。
具体就是:在g.add_edges_from(edgelist)操作之前,先把edgelist中的节点抽取出来按顺序排好,用操作g.add_nodes_from()把节点统一添加进图g中。修改后的代码如下:

修改后的代码

edgelist = [(0, 1),(1, 3),(2, 4),(1, 5),(1, 3),(5, 5),(1, 3)]
"""由于nx.MultiGraph()可累计多条重复边作为权重,所以(1,3)出现3次权重是3"""
g = nx.MultiGraph()  # 无向多边图""" 节点id按照顺序排!!否则生成的邻接矩阵不一样 """
nodeset = sorted(set(itertools.chain(*edgelist)))
g.add_nodes_from(nodeset)g.add_edges_from(edgelist)
print(g.nodes())
adj = sp.lil_matrix(nx.adjacency_matrix(g))
print(adj.todense())

修改代码后的运行结果

[0, 1, 2, 3, 4, 5]
[[0 1 0 0 0 0][1 0 0 3 0 1][0 0 0 0 1 0][0 3 0 0 0 0][0 0 1 0 0 0][0 1 0 0 0 1]]

函数说明

nodeset = sorted(set(itertools.chain(*edgelist)))这行的功能,是把edgelist中的元素展开,去重,按顺序排序。分开演示就是:

edgelist = [(0, 1),(1, 3),(2, 4),(1, 5),(1, 3),(5, 5),(1, 3)]
""" 把edgelist中的每个(a,b)元素打平成a,b """
nodes = list(itertools.chain(*edgelist))
print(nodes)
# 输出:
# [0, 1, 1, 3, 2, 4, 1, 5, 1, 3, 5, 5, 1, 3]""" 利用set元素唯一的性质,将重复元素去重 a,a => a """
nodeset = set(nodes)
print(nodeset)
# 输出:
# {0, 1, 2, 3, 4, 5}""" set中的元素是无序、非空、唯一的,所以对set再sorted一下,确保顺序是对的 """
nodeset = sorted(nodeset)
print(nodeset)
# 输出:
# [0, 1, 2, 3, 4, 5]

nx.adjacency_matrix计算邻接矩阵与真实结果不一致:解决办法记录相关推荐

  1. vs 警告当前源代码跟内置的版本不一致解决办法

    vs 警告当前源代码跟内置的版本不一致解决办法, 我在网上搜了一圈,各种方法都试过了,还是不行,编译出来的可执行文件用的还是旧的代码,把代码删了还是不行.我就奇怪了vs在哪里保存了原来的版本. 后来我 ...

  2. 分析appstore审核失败的真实案例及解决办法

    分析AppStore审核失败的真实案例及解决办法 App中设计的图标与Apple原生图标类似,Apple原生图标有专利保护,并且在Design Guideline里面规定,App的图标不能与Apple ...

  3. 目录前导符不一致解决办法

    最近弄毕业设计,写完论文以后发现生成的目录后面的前导码省略号数目.间距不一致,非常的难看,于是经过仔细研究找到了解决办法: 首先是问题所在,请看下图: 首先在word中打开引用工具栏,在插入目录的选项 ...

  4. OpenStack 计算节点关机,虚拟机状态解决办法

    检查服务正常化 1 nova-manage service list 发现很多nova服务没有启动. 全部启动,直到nova-manage service list所有服务都是:)而不是XXX. 虚拟 ...

  5. R语言计算相关系数时出现NA的解决办法

    如图使用cor()函数计算相关系数时出现了NA值.这是因为输入的数据中含有缺失值. df <- na.omit(df) # df 是传入cor()函数的数据框 只要使用na.omit()函数去除 ...

  6. iphone当前系统时间与服务器不一致,mac双系统时间不对怎么办 mac双系统时间不一致解决办法...

    mac双系统时间不对原因: Windows和MacOSX缺省看待PC的CMOS记录的时钟是不一样的. Windows将这个时钟作为本地时间来看待,也就是CMOS时间就是北京时间. MacOSX将这个时 ...

  7. 苹果当前系统时间与服务器不一致,mac双系统时间不对怎么办 mac双系统时间不一致解决办法...

    mac双系统时间不对原因: Windows和MacOSX缺省看待PC的CMOS记录的时钟是不一样的. Windows将这个时钟作为本地时间来看待,也就是CMOS时间就是北京时间. MacOSX将这个时 ...

  8. centos服务器系统时间与实际时间不一致解决办法

    很多朋友在安装完CentOS系统后发现时间与现在时间相差8小时,这是由于我们在安装系统的时选择的时区是上海,而CentOS默认bios时间是utc时间,所以时间相差了8小时. CentOS ---&g ...

  9. dede后台栏目管理文章统计数量和实际文章数不一致解决办法

    操作dede_arctiny表,将和栏目对应的typeid所有文章去掉即可. 转载于:https://www.cnblogs.com/zgzy/p/5432724.html

  10. AES加密,解决了同步问题,和随机密钥和固定密钥,多端通信加密不一致解决办法...

    1.密钥随机生成. import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyEx ...

最新文章

  1. 移动硬盘格式化了的资料找回方法
  2. discuz 二次开发
  3. 用html5做一个简单网页_用新款ws2812灯带做一个简单的窗花
  4. pycharm 调试_把xlwings盘顺溜:xlwings连接到Pycharm进行调试,以及xlwings转换器等的使用...
  5. 什么是线索评分?如何让线索评分发挥作用?
  6. vue中把table导出表格excel
  7. python集合常用方法_python基础-集合set的常用方法
  8. Web安全:SQL注入工具
  9. Ansible 运维自动化 ( 配置管理工具 )
  10. 五子棋大在线对战 java_五子棋可蓝牙对战版
  11. 在线人民币大写转换器工具-把数字金额转换成中文大写
  12. mate40怎么用鸿蒙系统,怎么使用鸿蒙系统?
  13. HDFS操作及命令介绍
  14. 对话诊断(X)2022IJCAI-My nose is running.Are you also coughing?:Building a Medical Diagnosis Agent with
  15. 戴尔服务器虚拟机巨兽龙在哪,dell服务器安装的vmware esxi 虚拟机紫萍
  16. mysql删除指令_mysql怎么用命令删除数据?
  17. 阿里巴巴java开发手册(alibaba网址在线查看或下载)
  18. 海康威视SDK:NET_DVR_GetDVRConfig failed Device does not support this function
  19. 红帽牵手阿里云,水到渠成的合作
  20. 街灯变成了平台,世界将会怎样

热门文章

  1. 没有比粥更温柔的了。念予毕生流离红尘,就找不到一个似粥温柔的人。
  2. 网易微专业IOS开发工程师教程(完整)
  3. 欧拉函数、费马定理、欧拉定理
  4. 蒙特卡罗模拟计算定积分(R)
  5. ARTS-17(富爸爸穷爸爸)
  6. EBS Form开发中LOV实现实例
  7. worldpress php部署,用XAMPP搭建本地主机(附worldpress的安装)
  8. R语言小代码(聚类练习)
  9. 【Jmeter】Jmeter登录带验证码平台
  10. 【2022牛客多校5 A题 Don‘t Starve】DP