0

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)、...の場合はどうなりますか?

より良い機能はありますか?

4

2 に答える 2

2

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)]
于 2013-02-06T05:27:07.190 に答える
1

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,3,4) です。

>>> p(3, 8)
array([[[2, 7],
        [2, 8],
        [2, 9]],

       [[3, 7],
        [3, 8],
        [3, 9]],

       [[4, 7],
        [4, 8],
        [4, 9]]])
于 2013-02-06T04:49:12.060 に答える