Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将格转化为图?_Python_R_Matrix_Graph - Fatal编程技术网

Python 将格转化为图?

Python 将格转化为图?,python,r,matrix,graph,Python,R,Matrix,Graph,假设我有一个间隔相等的d乘以Z的点阵,当且仅当这些点相邻时,我如何有效地将其转化为一个图,其中节点是点,两个点之间有一条边 例如:假设我们有一个整数平方中的点,对应于一个正方形的顶点。。。 我们如何将其转换为一个4乘4的矩阵(或图形),其中的条目为1或0。是否有边连接两个节点(对应于整数平方中的点) 这个例子很简单,原因有二: 这些点位于R平方,因此输入是一个二维数组(通常输入是一个d维数组;d>1) 大多数点是以一种明显的方式连接起来的……但这种模式(至少我发现)在d维中变得不那么明显,每个

假设我有一个间隔相等的d乘以Z的点阵,当且仅当这些点相邻时,我如何有效地将其转化为一个图,其中节点是点,两个点之间有一条边

例如:假设我们有一个整数平方中的点,对应于一个正方形的顶点。。。 我们如何将其转换为一个4乘4的矩阵(或图形),其中的条目为1或0。是否有边连接两个节点(对应于整数平方中的点)

这个例子很简单,原因有二:

  • 这些点位于R平方,因此输入是一个二维数组(通常输入是一个d维数组;d>1)
  • 大多数点是以一种明显的方式连接起来的……但这种模式(至少我发现)在d维中变得不那么明显,每个轴上有更多的点……(如果我们把8个点放在立方体的边缘上,这一点就更清楚了)
我正在寻找一个代码,它可以在给定任何这样的数组(作为输入)的情况下实现这一点,并输出一个(必须对称)矩阵,表示图上节点之间的边

我喜欢用R语言编程(并且愿意学习Python)


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站点上那样有效,所以请修复这个问题…完成,现在已经全部清理完毕,再次感谢:)