我试图在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
然而,这会返回许多冗余邻居。 有没有更好的解决方案?
答案 0 :(得分:1)
我打赌你需要的只是itertools包,特别是产品方法。您正在寻找的是您当前位置的笛卡尔乘积,每个坐标在每个方向上都被1扰动。因此,您将获得从您当前点得出的三元组列表:
diag_coord = [(x-1, x, x+1) for x in point]
现在,你获取所有这些三元组的产物,重新组合每一组,并且你有对角线。
这就是你需要的吗?