Merging non-overlapping array blocks

后端 未结 2 1134
南方客
南方客 2021-01-05 01:15

I divided a (512x512) 2-dimensional array to 2x2 blocks using this function.

skimage.util.view_as_blocks (arr_in, block_shape)
array([[ 0,  1,  2,  3],
   [         


        
相关标签:
2条回答
  • 2021-01-05 01:42

    Use transpose/swapaxes to swap the second and third axes and then reshape to have the last two axes merged -

    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])
    

    Sample run -

    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]])
    
    0 讨论(0)
  • 2021-01-05 01:51

    This is where you'd better use 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)')
    

    See documentation for more operations on images

    0 讨论(0)
提交回复
热议问题