寻找n维邻居

时间:2017-04-13 16:15:28

标签: python arrays recursion dimension

我试图在n维空间中获取一个单元的邻居,例如8-connected或26个连接的单元格,但在任何维度上都提供了一个n元组。

直接相邻的邻居很容易,任何维度只需+ 1 / -1。我遇到困难的部分是对角线,我可以将任意数量的坐标相差1。

我编写了一个为每个子维度重复的函数,并生成所有+/-组合:

def point_neighbors_recursive(point):
    neighbors = []
    # 1-dimension
    if len(point) == 1:
        neighbors.append([point[0] - 1])  # left
        neighbors.append([point[0]])  # current
        neighbors.append([point[0] + 1])  # right

        return neighbors

    # n-dimensional
    for sub_dimension in point_neighbors_recursion(point[1:]):
        neighbors.append([point[0] - 1] + sub_dimension)  # left
        neighbors.append([point[0]] + sub_dimension)  # center
        neighbors.append([point[0] + 1] + sub_dimension)  # right

    return neighbors

然而,这会返回许多冗余邻居。 有没有更好的解决方案?

1 个答案:

答案 0 :(得分:1)

我打赌你需要的只是itertools包,特别是产品方法。您正在寻找的是您当前位置的笛卡尔乘积,每个坐标在每个方向上都被1扰动。因此,您将获得从您当前点得出的三元组列表:

diag_coord = [(x-1, x, x+1) for x in point]

现在,你获取所有这些三元组的产物,重新组合每一组,并且你有对角线。

这就是你需要的吗?