Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在networkx和python中查找距离内的节点_Python_Networkx - Fatal编程技术网

在networkx和python中查找距离内的节点

在networkx和python中查找距离内的节点,python,networkx,Python,Networkx,networkx中是否有方法查找距离特定节点一定距离内的所有节点?如中所示,我指定一个节点和一个距离,并返回该距离内的所有节点。这是假设我为每条边添加了一个权重 或者,是否有一种方法可以从特定节点查找指定角度内的所有节点?比如,与特定节点相隔2度以内的所有节点是什么?度的意思是,一个节点连接到另一个节点。谢谢你的帮助 您可以使用networkx库的ego\u图功能: node = 3 # The center node radius = 3 # Degrees of separation new

networkx中是否有方法查找距离特定节点一定距离内的所有节点?如中所示,我指定一个节点和一个距离,并返回该距离内的所有节点。这是假设我为每条边添加了一个权重


或者,是否有一种方法可以从特定节点查找指定角度内的所有节点?比如,与特定节点相隔2度以内的所有节点是什么?度的意思是,一个节点连接到另一个节点。谢谢你的帮助

您可以使用
networkx
库的
ego\u图
功能:

node = 3 # The center node
radius = 3 # Degrees of separation
new_graph = nx.generators.ego_graph(graph, node, radius=radius)
例如:

import networkx as nx

G = nx.gnm_random_graph(n=n, m=30, seed=1)
G = nx.generators.ego_graph(G, 0, radius=2)

这将提供一个伪邻接矩阵,它表示所提供半径内的邻接(以度为单位,而非距离),而不仅仅是直接链接的节点

def neighbors_in_radius(G, radius):
    adj = np.array(nx.linalg.graphmatrix.adjacency_matrix(G).todense()).astype(float)  # much faster as float
    power_adj = connected = adj
    for i in range(radius - 1):
        power_adj = power_adj.dot(adj)
        connected = connected + power_adj
    connected = connected.astype(bool).astype(int)
    return connected
在某些情况下,这应该比networkx解决方案快得多,具体取决于边与节点的比率以及要求解的节点数

G = nx.gnm_random_graph(n=1000, m=10000, seed=1)
%time v1 = neighbors_in_radius(G, radius=2)  # 98 ms 
%time np.where(v1[n]) # 29 microsec  # to get results for specific node

%time v2 = [nx.generators.ego_graph(G, n, radius=2).nodes for n in G.nodes] # 21 sec

# confirm solutions equivalent
assert v1.sum(axis=1).tolist() == [len(x) for x in v2]