我对Python编码比较陌生(我主要是因为运行时间速度而从R切换)而我正在试图弄清楚如何编写一个接近图。
假设我在d维欧氏空间中有一个均匀间隔点的数组,这些将是我的节点。我想通过连接两个点将它们变成一个无向图,当且仅当它们位于e之间时。如何使用参数对此功能进行编码:
答案 0 :(得分:2)
graph-tool库有much of the functionality you need。假设你有numpy
和graph-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。零表示两个节点未连接。
在此代码中,我假设您的nodeList
是nodeList = [[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