在python中获取点的邻接矩阵

在python中获取点的邻接矩阵,python,matrix,point,Python,Matrix,Point,如果在2D中,p(x,y),我想要一个3*3的邻接矩阵: (x-1,y-1), (x,y-1), (x+1,y-1), ... (x-1,y+1), (x,y+1), (x+1,y+1), 如果在3D(3*3*3)、4D(3*3*3*3)中 有更好的功能吗?您可以使用numpy中的广播来获得结果: import numpy as np def p(*args): args = np.array(args) idx = np.array([-1, 0, 1]) a = n

如果在2D中,p(x,y),我想要一个3*3的邻接矩阵:

(x-1,y-1), (x,y-1), (x+1,y-1),
...
(x-1,y+1), (x,y+1), (x+1,y+1),
如果在3D(3*3*3)、4D(3*3*3*3)中


有更好的功能吗?

您可以使用numpy中的广播来获得结果:

import numpy as np
def p(*args):
    args = np.array(args)
    idx = np.array([-1, 0, 1])
    a = np.broadcast_arrays(*np.ix_(*(args[:,None] + idx)))
    return np.concatenate([x[..., None] for x in a], axis=-1)
结果形状在2D中为(3,3,2),在3D中为(3,3,3,3),在4D中为(3,3,3,4):


您可以在numpy中使用广播来获得结果:

import numpy as np
def p(*args):
    args = np.array(args)
    idx = np.array([-1, 0, 1])
    a = np.broadcast_arrays(*np.ix_(*(args[:,None] + idx)))
    return np.concatenate([x[..., None] for x in a], axis=-1)
结果形状在2D中为(3,3,2),在3D中为(3,3,3,3),在4D中为(3,3,3,4):


您还可以使用
itertools.product
,具体取决于您喜欢的输出格式。这将比
numpy
方法慢,但我发现它更容易理解:

from itertools import product

def adjacent_grid(centre):
    steps = product([-1, 0, 1], repeat=len(centre))
    return (tuple(c+d for c,d in zip(centre, delta)) for delta in steps)

>>> list(adjacent_grid((3,)))
[(2,), (3,), (4,)]
>>> list(adjacent_grid((3,3)))
[(2, 2), (2, 3), (2, 4), (3, 2), (3, 3), (3, 4), (4, 2), (4, 3), (4, 4)]
>>> list(adjacent_grid((3,3,3)))
[(2, 2, 2), (2, 2, 3), (2, 2, 4), (2, 3, 2), (2, 3, 3), (2, 3, 4), (2, 4, 2), (2, 4, 3), (2, 4, 4), (3, 2, 2), (3, 2, 3), (3, 2, 4), (3, 3, 2), (3, 3, 3), (3, 3, 4), (3, 4, 2), (3, 4, 3), (3, 4, 4), (4, 2, 2), (4, 2, 3), (4, 2, 4), (4, 3, 2), (4, 3, 3), (4, 3, 4), (4, 4, 2), (4, 4, 3), (4, 4, 4)]

您还可以使用
itertools.product
,具体取决于您喜欢的输出格式。这将比
numpy
方法慢,但我发现它更容易理解:

from itertools import product

def adjacent_grid(centre):
    steps = product([-1, 0, 1], repeat=len(centre))
    return (tuple(c+d for c,d in zip(centre, delta)) for delta in steps)

>>> list(adjacent_grid((3,)))
[(2,), (3,), (4,)]
>>> list(adjacent_grid((3,3)))
[(2, 2), (2, 3), (2, 4), (3, 2), (3, 3), (3, 4), (4, 2), (4, 3), (4, 4)]
>>> list(adjacent_grid((3,3,3)))
[(2, 2, 2), (2, 2, 3), (2, 2, 4), (2, 3, 2), (2, 3, 3), (2, 3, 4), (2, 4, 2), (2, 4, 3), (2, 4, 4), (3, 2, 2), (3, 2, 3), (3, 2, 4), (3, 3, 2), (3, 3, 3), (3, 3, 4), (3, 4, 2), (3, 4, 3), (3, 4, 4), (4, 2, 2), (4, 2, 3), (4, 2, 4), (4, 3, 2), (4, 3, 3), (4, 3, 4), (4, 4, 2), (4, 4, 3), (4, 4, 4)]

如果我使用res.flat到iter元素呢?我想得到点元组而不是p(3,8)中的inti。flat:print iYou可以重塑结果:
p(3,8)。重塑(-1,2)
如果我对iter元素使用res.flat怎么办?我想得到点元组而不是p(3,8)中的inti。平面:打印i您可以重塑结果:
p(3,8)。重塑(-1,2)