在具有周期性边界的滑动窗口中查看网格的单元格

时间:2017-05-03 23:23:53

标签: python numpy

考虑2D数组

>>> A = np.array(range(16)).reshape(4, 4)
>>> A
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

我想构造一个函数f(i,j),它利用周期性边界条件从A [i,j]周围的元素中拉出3x3块。

例如,非边界元素将是

>>> f(1,1)
array([[ 0,  1,  2],
       [ 4,  5,  6],
       [ 8,  9, 10]])

和边界元素

>>> f(0,0)
array([[15, 12, 13],
       [ 3,  0,  1],
       [ 7,  4,  5]])

view_as_windows接近但不包围周期性边界。

>>> from skimage.util.shape import view_as_windows
>>> view_as_windows(A,(3,3))
array([[[[ 0,  1,  2],
     [ 4,  5,  6],
     [ 8,  9, 10]],

    [[ 1,  2,  3],
     [ 5,  6,  7],
     [ 9, 10, 11]]],


   [[[ 4,  5,  6],
     [ 8,  9, 10],
     [12, 13, 14]],

    [[ 5,  6,  7],
     [ 9, 10, 11],
     [13, 14, 15]]]])

在这种情况下,view_as_windows(A)[0,0] == f(1,1)但f(0,0)不在view_as_windows(A)中。我需要一个view_as_windows(A)类型数组,其元素数与A相同,其中每个元素都有形状(3,3)

1 个答案:

答案 0 :(得分:1)

只需使用np.pad填充wrapping功能,然后使用Scikit's view_as_windows -

from skimage.util.shape import view_as_windows

Apad = np.pad(A,1,'wrap')
out = view_as_windows(Apad,(3,3))

示例运行 -

In [65]: A
Out[65]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

In [66]: Apad = np.pad(A,1,'wrap')

In [67]: out = view_as_windows(Apad,(3,3))

In [68]: out[0,0]
Out[68]: 
array([[15, 12, 13],
       [ 3,  0,  1],
       [ 7,  4,  5]])

In [69]: out[1,1]
Out[69]: 
array([[ 0,  1,  2],
       [ 4,  5,  6],
       [ 8,  9, 10]])