删除节点子集之间的所有边
Remove all edges between a subset of nodes
我有一个图表 g
和图表中的节点列表 subset_nodes
。我想删除节点 v_i
、v_j
之间的所有边,其中 v_i
和 v_j
在 subset_nodes
.
中
我目前正在使用以下方法:
import igraph
g = igraph.Graph.Full(10)
subset_nodes = [g.vs[i] for i in range(4)]
to_delete = set()
for node in subset_nodes:
for v in node.neighbors():
if v in subset_nodes:
tp = (node.index, v.index)
to_delete.add( tuple(sorted(tp)) )
print(len(g.es))
g.delete_edges( to_delete )
print(len(g.es))
这会打印:
45
39
这是有道理的,因为
10 choose 2 = 45 # total # of edges (since it is a full graph)
4 choose 2 = 6 # # of removed edges
45 - 6 = 39 # # of edges remaining
我的问题是,是否有更好、更优雅或更 pythonic 的方式来做同样的事情?
Igraph 有 "induced_subgraph" 方法,可以方便地获得更简洁的解决方案:
import igraph as ig
g=ig.Graph.Full(10)
subset_nodes=[g.vs[i] for i in range(4)]
smallgraph=g.induced_subgraph(subset_nodes)
es=ig.EdgeSeq(smallgraph)
mytup=[e.tuple for e in es]
g.delete_edges(mytup)
另一种解决方案是:
from igraph import Graph
g = Graph.Full(10)
g.es.select(_within=range(4)).delete()
我有一个图表 g
和图表中的节点列表 subset_nodes
。我想删除节点 v_i
、v_j
之间的所有边,其中 v_i
和 v_j
在 subset_nodes
.
我目前正在使用以下方法:
import igraph
g = igraph.Graph.Full(10)
subset_nodes = [g.vs[i] for i in range(4)]
to_delete = set()
for node in subset_nodes:
for v in node.neighbors():
if v in subset_nodes:
tp = (node.index, v.index)
to_delete.add( tuple(sorted(tp)) )
print(len(g.es))
g.delete_edges( to_delete )
print(len(g.es))
这会打印:
45
39
这是有道理的,因为
10 choose 2 = 45 # total # of edges (since it is a full graph)
4 choose 2 = 6 # # of removed edges
45 - 6 = 39 # # of edges remaining
我的问题是,是否有更好、更优雅或更 pythonic 的方式来做同样的事情?
Igraph 有 "induced_subgraph" 方法,可以方便地获得更简洁的解决方案:
import igraph as ig
g=ig.Graph.Full(10)
subset_nodes=[g.vs[i] for i in range(4)]
smallgraph=g.induced_subgraph(subset_nodes)
es=ig.EdgeSeq(smallgraph)
mytup=[e.tuple for e in es]
g.delete_edges(mytup)
另一种解决方案是:
from igraph import Graph
g = Graph.Full(10)
g.es.select(_within=range(4)).delete()