2017-04-13 109 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] 

現在,你把所有的三元組的產品,再結合各一套,你有你的對角線。

這就是你需要的嗎?