合并非重叠的数组块

时间:2017-01-06 16:52:33

标签: python numpy scikit-image

我使用此功能将(512x512)2维阵列划分为2x2块。

skimage.util.view_as_blocks (arr_in, block_shape)
array([[ 0,  1,  2,  3],
   [ 4,  5,  6,  7],
   [ 8,  9, 10, 11],
   [12, 13, 14, 15]])
   >>> B = view_as_blocks(A, block_shape=(2, 2))
   >>> B[0, 0]
   array([[0, 1],
          [4, 5]])
   >>> B[0, 1]
   array([[2, 3],
          [6, 7]])

现在我需要在操作后将相同的块放到原来的位置,但我无法在skimage中看到任何功能。

以前合并非重叠数组的最佳方法是什么?

谢谢!

2 个答案:

答案 0 :(得分:5)

使用转置/交换轴交换第二和第三轴,然后重新整形以合并最后两个轴 -

B.transpose(0,2,1,3).reshape(-1,B.shape[1]*B.shape[3])
B.swapaxes(1,2).reshape(-1,B.shape[1]*B.shape[3])

示例运行 -

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

In [42]: B = view_as_blocks(A, block_shape=(2, 2))

In [43]: B
Out[43]: 
array([[[[ 0,  1],
         [ 4,  5]],

        [[ 2,  3],
         [ 6,  7]]],


       [[[ 8,  9],
         [12, 13]],

        [[10, 11],
         [14, 15]]]])

In [44]: B.transpose(0,2,1,3).reshape(-1,B.shape[1]*B.shape[3])
Out[44]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

答案 1 :(得分:0)

这是您最好使用einops的地方:

from einops import rearrange

# that's how you could rewrite view_as_blocks
B = rearrange(A, '(x dx) (y dy) -> x y dx dy', dx=2, dy=2)

# that's an answer to your question
A = rearrange(B, 'x y dx dy -> (x dx) (y dy)')

有关图像的更多操作,请参见documentation