You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Networkx中删除有向图孤立节点及无入邻居节点的实现疑问

解决Networkx有向图中删除无入邻居节点的问题

针对你在灭绝实验中的需求,这里提供通用的检测和删除无入邻居节点的方法,结合你给出的实验场景完整实现步骤:

核心思路

无入邻居节点本质是入度为0的节点(在有向图DiGraph中),可通过Networkx的in_degree()方法直接检测。同时需要循环处理——因为删除这类节点或孤立节点后,可能会产生新的待删除节点,直到图中既没有孤立节点也没有无入邻居节点为止。

完整代码实现

import numpy as np
import networkx as nx
import matplotlib.pyplot as plt

# 初始化邻接矩阵和有向图
mat = np.array([[0,1,1,1,0,1],
                [1,0,0,0,0,0],
                [1,0,0,0,0,0],
                [1,0,0,0,0,0],
                [1,0,0,0,0,0],
                [1,0,0,1,0,0]])    # 实验邻接矩阵
G = nx.from_numpy_array(mat, create_using=nx.DiGraph)

print("初始节点数:", G.number_of_nodes())
print("初始边数:", G.number_of_edges())

# 步骤1:删除指定节点(这里以节点0为例)
G.remove_node(0)

# 循环处理:删除孤立节点和无入邻居节点,直到没有符合条件的节点
while True:
    # 收集当前需要删除的节点:孤立节点 + 入度为0的节点
    nodes_to_remove = list(nx.isolates(G)) + [node for node in G if G.in_degree(node) == 0]
    # 去重(避免同一节点被重复标记)
    nodes_to_remove = list(set(nodes_to_remove))
    if not nodes_to_remove:
        break  # 没有待删除节点时退出循环
    G.remove_nodes_from(nodes_to_remove)
    print(f"删除节点: {nodes_to_remove},当前节点数: {G.number_of_nodes()}")

# 绘制处理后的图
nx.draw_networkx(G)
plt.show()

print("最终节点数:", G.number_of_nodes())
print("最终边数:", G.number_of_edges())

关键部分说明

  1. 检测无入邻居节点:
    使用列表推导式[node for node in G if G.in_degree(node) == 0]遍历图中所有节点,筛选出入度为0的节点,这就是你需要的无入邻居节点。
  2. 循环处理逻辑:
    每次循环同时收集孤立节点和无入邻居节点,批量删除后再次检查,直到没有符合条件的节点为止。这样能处理删除节点后新产生的待删除节点(比如你的场景中,删除节点5后,节点3会变成入度为0的节点,会被下一轮循环处理)。
  3. 去重处理:
    有些节点可能既是孤立节点又是入度为0的节点(孤立节点的入度和出度均为0),去重可避免重复删除导致的报错。

你的实验场景执行结果

删除节点0后,第一轮循环会删除孤立节点1、2、4,以及入度为0的节点5;第二轮循环会发现节点3入度变为0,将其删除,最终图中无剩余节点。

内容的提问来源于stack exchange,提问作者JuanmaGun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:27:47