我尝试使用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/