Python 将格转化为图?
假设我有一个间隔相等的d乘以Z的点阵,当且仅当这些点相邻时,我如何有效地将其转化为一个图,其中节点是点,两个点之间有一条边 例如:假设我们有一个整数平方中的点,对应于一个正方形的顶点。。。 我们如何将其转换为一个4乘4的矩阵(或图形),其中的条目为1或0。是否有边连接两个节点(对应于整数平方中的点) 这个例子很简单,原因有二:Python 将格转化为图?,python,r,matrix,graph,Python,R,Matrix,Graph,假设我有一个间隔相等的d乘以Z的点阵,当且仅当这些点相邻时,我如何有效地将其转化为一个图,其中节点是点,两个点之间有一条边 例如:假设我们有一个整数平方中的点,对应于一个正方形的顶点。。。 我们如何将其转换为一个4乘4的矩阵(或图形),其中的条目为1或0。是否有边连接两个节点(对应于整数平方中的点) 这个例子很简单,原因有二: 这些点位于R平方,因此输入是一个二维数组(通常输入是一个d维数组;d>1) 大多数点是以一种明显的方式连接起来的……但这种模式(至少我发现)在d维中变得不那么明显,每个
- 这些点位于R平方,因此输入是一个二维数组(通常输入是一个d维数组;d>1)
- 大多数点是以一种明显的方式连接起来的……但这种模式(至少我发现)在d维中变得不那么明显,每个轴上有更多的点……(如果我们把8个点放在立方体的边缘上,这一点就更清楚了)
Ps.s:我为奇怪的语法道歉…此交换显然与LaTeX不兼容…:0这可以在Python中实现,如下所示:
from itertools import product
def print_lattice_edges(lattice):
"""prints all edges of a lattice, given as a list of lists of coordinates"""
for idim, dim_coords in enumerate(lattice):
for other_coords in product(*lattice[:idim] + lattice[idim+1:]):
for coord1, coord2 in zip(dim_coords[:-1], dim_coords[1:]):
edge1 = other_coords[:idim] + (coord1,) + other_coords[idim:]
edge2 = other_coords[:idim] + (coord2,) + other_coords[idim:]
print edge1, '->', edge2
说明:
- 首先在所有标注上循环,选择该标注的所有坐标
- 通过删除选定标注来创建新晶格,并使用以下命令对其余标注的所有可能坐标组合进行迭代:
- 对于选定的维度,迭代所有可能的连续坐标对
- 通过将选定标注的坐标放回正确位置的笛卡尔积,生成边的两个坐标
In [23]: print_lattice_edges([[0, 1], [0, 1]]) # your example
(0, 0) -> (1, 0)
(0, 1) -> (1, 1)
(0, 0) -> (0, 1)
(1, 0) -> (1, 1)
In [24]: print_lattice_edges([[0, 1], [3, 4, 5]]) # 2x3 points, 7 edges
(0, 3) -> (1, 3)
(0, 4) -> (1, 4)
(0, 5) -> (1, 5)
(0, 3) -> (0, 4)
(0, 4) -> (0, 5)
(1, 3) -> (1, 4)
(1, 4) -> (1, 5)
In [25]: print_lattice_edges([[0, 1], [0, 1], [0, 1]]) # cube, 12 edges
(0, 0, 0) -> (1, 0, 0)
(0, 0, 1) -> (1, 0, 1)
(0, 1, 0) -> (1, 1, 0)
(0, 1, 1) -> (1, 1, 1)
(0, 0, 0) -> (0, 1, 0)
(0, 0, 1) -> (0, 1, 1)
(1, 0, 0) -> (1, 1, 0)
(1, 0, 1) -> (1, 1, 1)
(0, 0, 0) -> (0, 0, 1)
(0, 1, 0) -> (0, 1, 1)
(1, 0, 0) -> (1, 0, 1)
(1, 1, 0) -> (1, 1, 1)
太好了!非常感谢你,Bas(我是python新手,所以这对我来说不是那么直观)小问题(因为我对python还是很陌生),如果我想在一定距离内的任意两个节点之间(在R中)有一条边从彼此而不是仅在相邻节点之间,我如何修改上述代码?@CSA这很难快速解释,最好单独问一个问题。这样做的“暴力”方式将
适用于所有可能的坐标中的c1:适用于所有可能的坐标中的c2:如果距离(c1,c2)
。请注意,此算法循环所有可能的组合,因此需要O(npoints^2)
操作,对于大问题,这可能会很慢。我的答案中的解决方案仅适用于O(npoints*ndim)
,如果ndim
很小,这是没有问题的。很酷,谢谢你的反馈,我很快会就此发布一个新问题。再次感谢latex语法在stackoverflow上不像在其他stackexchange站点上那样有效,所以请修复这个问题…完成,现在已经全部清理完毕,再次感谢:)