如何使用新的集群成员更新 python igraph 对象?

How do I update a python igraph object with new cluster membership?

如何使用聚类方法的结果更新 igraph 图?

我在 Python 中执行了一些聚类。

例如,我有一个igraph图形对象:

# Generate a graph with 100 nodes and 250 edges.
import igraph
g = igraph.Graph.Erdos_Renyi(n=100,m=250) 

然后我应用我的聚类算法。在这种情况下,出于示例目的,我只是将每个节点随机分配到集群 0-3。

# Make a random partition of 4 clusters.
from random import randint
partition = [randint(0,3) for x in range(100)]

我可以生成一个 igraph 聚类对象:

# Cluster the graph.
clusters = igraph.VertexClustering(g,membership = partition)

这使我能够访问此 class 的所有有用方法,例如:

clusters.modularity

但是,我想用我的聚类结果更新原始图 g

# Checks.
clusters.membership == partition # True
clusters.graph.clusters().membership == partition # False - I want this to be True.

有什么办法可以做到这一点吗?

Graph.clusters() 方法 returns 每次调用一个新的 VertexClustering 对象,聚类永远不会作为图形的一部分存储。

如果你真的需要在图对象中存储聚类,你总是可以使用setattr

>>> setattr(g, "clustering", clusters)
>>> clusters.graph.clustering.membership == partition
True

如果您 p​​ickle 对象,集群将被保留。

>>> import pickle
>>> pickle.dump(g, open("graph.pickle", "wb"))
>>> ng = pickle.load(open("graph.pickle", "rb"))
>>> ng.clustering.membership == partition
True