如何从networkx图中提取随机节点?

Posted

技术标签:

【中文标题】如何从networkx图中提取随机节点?【英文标题】:How to extract random nodes from networkx graph? 【发布时间】:2015-01-02 06:52:19 【问题描述】:

我有一个 networkx 图形式的地图,我必须从中提取 5 个随机节点并获取与每个节点及其边缘相关联的数据。我想我可以用“np.random.choice”做到这一点,但我仍然无法得到任何结果。

【问题讨论】:

请发布您的代码。 相关新问题:***.com/questions/48598324/… 【参考方案1】:
import networkx as nx
from random import choice

g = nx.Graph()
g.add_edge(1,2)
g.add_edge(1,3)
g.add_edge(1,4)
g.add_edge(1,5)
g.add_edge(5,6)

random_node = choice(g.nodes())

来自可能的重复: how to select two nodes (pairs of nodes) randomly from a graph that are NOT connected, Python, networkx

【讨论】:

随着networkx 2.0的发布,这不再起作用了。您可以改用choice(list(g.nodes)) @Carl 请将此作为答案发布 @Code-Apprentice 已发布答案。【参考方案2】:

请检查sample 方法,而不是使用choice

from random import sample
import os
import networkx as nx

# load a graph from local
working_path = r'XXX'
graph = nx.read_gexf(os.path.join(working_path, 'XXX.gexf'))
# random sample 3 nodes from the graph
random_nodes = sample(list(graph.nodes()), 3)

如果您有一个具有不同节点类型的图形g,您可以使用以下函数来计算具有特定类型的节点数:

def count_nodes_with_type(graph, attribute_name, query):
    """
    Count the number of nodes with specific type
    :param graph: a networkx graph whose nodes have several different types
    :param attribute_name: the attribute name used to access different type of nodes
    :param query: the search query
    :return: number of nodes satisfying the query
    """
    node_attribute_dict = nx.get_node_attributes(graph, attribute_name)
    filtered_nodes = key: value for (key, value) in node_attribute_dict.items() if value == query
    return len(filtered_nodes)

您可以使用相同的逻辑来使用nx.get_edge_attributes 方法计算特定类型边的数量。

【讨论】:

【参考方案3】:

对于 NetworkX 的最新版本(我认为是>= 2.5),您可以直接在节点视图上使用random.sample() 来获取节点的标签/索引或标签和数据的样本节点。

import networkx as nx
import random as rd

# Generate the example Karate club graph provided in NetworkX
g = nx.karate_club_graph()
print(g.nodes)  # Output: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33]

# Get a random sample (without replacement) of the node labels/indexes:
sample = rd.sample(g.nodes, 3)
print(sample)  # Output: [22, 18, 6]

# Get a random sample (without replacement) of the node labels and data:
sample = rd.sample(g.nodes.items(), 3)
print(sample)  # Output: [(24, 'club': 'Officer'), (27, 'club': 'Officer'), (31, 'club': 'Officer')]

在稍旧的版本中(从2.02.5 之前),您需要在使用random.sample 之前将节点视图转换为列表。

注意:如果您安装了最新的 NetworkX 软件包,则不必担心这一点。

# Get a random sample (without replacement) of the node labels/indexes
# in older version of NetworkX.
sample = rd.sample(list(g.nodes), 3)

【讨论】:

以上是关于如何从networkx图中提取随机节点?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据注释属性对networkx python图中的节点进行分组?

子图中的 networkx 正在绘制部分在轴框架之外的节点

在networkx(Python)中获取有向图的根(头)

计算图中的许多最短路径

尝试使用networkx查找两个节点之间的距离(欧几里得)

查找 NetworkX 中所有节点对之间的所有最短路径