2017-04-13 111 views
0

我想获得一个n维空间中的单元格的邻居,类似8-connected或26连接的单元格,但在任何维度提供了n元组。查找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 

但是这会返回很多冗余的邻居。 有没有更好的解决方案?

+0

你可以给出一个简单的例子,比如2D或3D的输出吗?当我在多个维度上尝试代码时,我会得到我期望的相邻点的集合:3 ^维(包括原始)。 – Prune

回答

1

我敢打赌,你需要的是在itertools包,特别是产品方法。你要找的是你当前位置的笛卡尔乘积,每个坐标在每个方向上被扰动1。因此,你必须从当前点衍生三元的列表:

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

现在,你把所有的三元组的产品,再结合各一套,你有你的对角线。

这就是你需要的吗?