用Python计算n维场的邻居

3

当给定一个n维矩阵和网格尺寸为1时,我想计算一个字段的最近邻。 以下是一个二维场地的示例:

P = (1,1)

p_neighbours = [(0,0),(2,2),(0,1),(0,2),(1,0),(2,0),(2,1),(1,2)]

从数学上讲,这可以在向量系统中轻松描述为P +/- 1(就我所知)。 n维邻居数组的大小描述为(n ^ 3)-1。我已经找到了一个相当不错的旧主题,但是我无法理解如何将任何提出的解决方案扩展到n维函数。

4个回答

7
from itertools import product

def stencil(dim):
    stencils = list(product([-1,0,1], repeat=dim))
    zero = ((0,) * dim)
    stencils.remove(zero)
    return stencils

def neighbours(P):
    stencils = stencil(len(P))
    return [tuple([sum(x) for x in zip(P,s)]) for s in stencils]

P = (4, 4, 4)

print(neighbours(P))

哇,这太棒了!对我很有效,我得详细研究一下! - Fohlen
Stencil只是生成[-1,0,1]的dim维笛卡尔积列表:邻居的相对位置。这包括dim-维零,例如(0,0,0),然后将其删除。邻居只是将每个“移位向量”添加到P中,它是该函数中的第二行,我发现它很困惑。如果您经常进行此类操作,我想使用numpy是一个好主意。 - hvwaldow

1
为了正确,n维邻居数组的大小不是(n^3)-1,而是(3^n)-1 (如果n>3,则数组大小要大得多!) 要在任何维度中生成邻居,您必须实现一个递归算法,迭代维度并调用自身(我不确定如何实现,但我正在努力)。

0

我猜应该是这样的

p_neighbours = []
for x in [-1,0,1]:
  for y in [-1,0,1]:
    p_neighbours.append((P(0)+x,P(1)+y))

0

我认为这里最清晰的方法是使用简单的列表推导式:

p = (1,1)
px, py = p
p_neighbours = [(px+x,py+y) for x in range(-1,2) for y in range(-1,2) if (x,y) != (0,0)]

在这里,我们检查(x,y)不是(0,0),以避免将p本身加入其邻居。


1
显然你没有仔细阅读问题..我非常清楚如何处理二维数组。有趣的部分是下面讨论的n维递归。 - Fohlen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接