假设我在d倍的Z中有一个点格子,间距相等,我怎样才能有效地将其转换成一个图形,其中节点是点和两点之间的边缘,当且仅当这些点相邻时?
例如:假设我们给出了对应于正方形顶点的整数平方的点... 我们如何将其转换为4×4矩阵(或图形),条目1或0是否有连接两个节点的边(对应于整数平方中的点)
这个例子很简单,原因有两个:
我正在寻找一个代码,它可以在给定任何这样的数组(作为输入)的情况下实现这一点,并输出表示图上节点之间边缘的(必然对称)矩阵。
我在R中编程(并且开放学习Python)。
Ps.s:我为奇怪的语法道歉...这个交换显然与LaTeX不兼容......:0
答案 0 :(得分:3)
这可以像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
说明:
首先在所有维度上循环,选择该维度的所有坐标
通过移除所选维度创建新网格,并使用Cartesian product
对于选定的维度,迭代所有可能的连续坐标对。
通过将所选尺寸的坐标放回到正确位置的笛卡尔积中,生成边的两个坐标。
如果您的应用涉及数百万点并且速度是个问题,您可以通过使用numpy生成笛卡尔积来做类似的事情。
一些快速测试:
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)