寻找 n 维邻居
Finding n-dimensional neighbors
我正在尝试获取 n 维 space 中某个单元格的邻居,类似于 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
不过这returns很多多余的邻居。
有没有更好的解决方案?
我敢打赌,您所需要的全部都在 itertools 包中,尤其是 product 方法。您正在寻找的是您当前位置的笛卡尔积,每个坐标在每个方向上扰动 1。因此,您将有一个从当前点派生的三元组列表:
diag_coord = [(x-1, x, x+1) for x in point]
现在,你把所有这些三元组的乘积,重新组合每组,你就有了对角线。
这是你需要的吗?
我正在尝试获取 n 维 space 中某个单元格的邻居,类似于 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
不过这returns很多多余的邻居。 有没有更好的解决方案?
我敢打赌,您所需要的全部都在 itertools 包中,尤其是 product 方法。您正在寻找的是您当前位置的笛卡尔积,每个坐标在每个方向上扰动 1。因此,您将有一个从当前点派生的三元组列表:
diag_coord = [(x-1, x, x+1) for x in point]
现在,你把所有这些三元组的乘积,重新组合每组,你就有了对角线。
这是你需要的吗?