我尝试使用copy.deepcopy(graph)但出现错误:

我的代码:

new_graph = TNEANet.New()
....
# some define for new_graph
....
copy_graph = copy.deepcopy(new_graph)


执行错误:

TypeError: object.__new__(SwigPyObject) is not safe, use SwigPyObject.__new__()


我也发现API具有定义API Document。因此,我尝试使用TNEANet(Graph)来完成该任务:

new_graph = TNEANet.New()
....
# some define for new_graph
....
copy_graph = TNEANet(new_graph)


执行错误:

TypeError: in method 'new_TNEANet', argument 1 of type 'TSIn &'

最佳答案

简短答案

最好的办法是自己复制节点,边线和属性。我发现转储到文件并重新加载也运行得很好,尽管如果使用PNEANet它将不会复制属性。这是我用来复制图形的便捷函数(比迭代快):

def copy_graph(graph):
    tmpfile = '.copy.bin'

    # Saving to tmp file
    FOut = snap.TFOut(tmpfile)
    graph.Save(FOut)
    FOut.Flush()

    # Loading to new graph
    FIn = snap.TFIn(tmpfile)
    graphtype = type(graph)
    new_graph = graphtype.New()
    new_graph = new_graph.Load(FIn)

    return new_graph


长答案

有一种方法可以执行图形的深层复制:

import snap
new_graph = snap.TNEANet.New()
....
# some define for new_graph
....
copy_graph = snap.TNEANet(new_graph())


(这适用于任何类型的图)
问题在于,当我们需要snap.TNEANet时,它将返回snap.PNEANet。后者只是C ++实现中指向前者的指针,但是我们无法在Python中创建此指针。结果,copy_graph的功能将少于new_graph

说明:

SNAP正在使用python的代理表示形式,这使深度复制过程变得有些复杂。复制构造函数期望使用非代理类型,而您将其赋予python代理类型。
引发TypeError,显示第一个构造函数的签名,并带有它知道的1个参数(此处完全不相关)。

为了解决这个问题,我们需要为构造函数提供使用self.__call__()方法获得的基础C ++类型。

但是由于C ++(错误的?)实现,snap.TNEANet(new_graph())输出了snap.TNEANet。这意味着此函数的输出将是非代理类型。结果,它不能与大多数SNAP功能一起使用...

关于python - 如何在Snap.py中复制Graph对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23133372/

10-13 09:43