python中的接近图

时间:2016-03-24 14:30:51

标签: python r graph

我对Python编码比较陌生(我主要是因为运行时间速度而从R切换)而我正在试图弄清楚如何编写一个接近图。

假设我在d维欧氏空间中有一个均匀间隔点的数组,这些将是我的节点。我想通过连接两个点将它们变成一个无向图,当且仅当它们位于e之间时。如何使用参数对此功能进行编码:

  • n:同一轴上两点之间的间距
  • d:R ^ d的维度
  • e:边缘存在的最大距离。

2 个答案:

答案 0 :(得分:2)

graph-tool库有much of the functionality you need。假设你有numpygraph-tool

,那么你可以这样做
coords = numpy.meshgrid(*(numpy.linspace(0, (n-1)*delta, n) for i in range(d)))
# coords is a Python list of numpy arrays
coords = [c.flatten() for c in coords]
# now coords is a Python list of 1-d numpy arrays
coords = numpy.array(coords).transpose()
# now coords is a numpy array, one row per point
g = graph_tool.generation.geometric_graph(coords, e*(1+1e-9))

愚蠢的e*(1+1e-9)因为你的标准是“距离< = e”而geometric_graph的标准是“距离< e”。

有一个名为delta的参数,你没有提及,因为我认为你对参数n的描述是对两个参数(点之间的间距和点数)起作用。

答案 1 :(得分:1)

这段代码应该可行,尽管它当然不是最有效的。它将遍历每个节点并检查它与所有其他节点的距离(尚未与它进行比较)。如果该距离小于您的值e,则连接矩阵中的相应值将设置为1。零表示两个节点未连接。

在此代码中,我假设您的nodeListnodeList = [[x1,y1,...],[x2,y2,...],...[xN,yN,...]]形式的笛卡尔坐标列表。我还假设你有一些叫做calcDistance的函数,它返回两个笛卡尔坐标之间的欧氏距离。这是基本的,足以实现我没有为此编写代码,并且在任何情况下使用函数都允许将来进行泛化和修改。

numNodes = len(nodeList)
connected = np.zeros([numNodes,numNodes])
for i, n1 in enumerate(nodeList):
    for j, n2 in enumerate(nodeList[i:]):
        dist = calcDistance(n1, n2)
        if dist < e:
            connected[i,j] = 1
            connected[j,i] = 1