Form a big 2d array from multiple smaller 2d arrays

前端 未结 5 661
囚心锁ツ
囚心锁ツ 2020-12-01 02:44

The question is the inverse of this question. I\'m looking for a generic method to from the original big array from small arrays:

array([[[ 0,  1,  2],
             


        
5条回答
  •  时光取名叫无心
    2020-12-01 03:06

    import numpy as np
    def blockshaped(arr, nrows, ncols):
        """
        Return an array of shape (n, nrows, ncols) where
        n * nrows * ncols = arr.size
    
        If arr is a 2D array, the returned array looks like n subblocks with
        each subblock preserving the "physical" layout of arr.
        """
        h, w = arr.shape
        return (arr.reshape(h//nrows, nrows, -1, ncols)
                   .swapaxes(1,2)
                   .reshape(-1, nrows, ncols))
    
    
    def unblockshaped(arr, h, w):
        """
        Return an array of shape (h, w) where
        h * w = arr.size
    
        If arr is of shape (n, nrows, ncols), n sublocks of shape (nrows, ncols),
        then the returned array preserves the "physical" layout of the sublocks.
        """
        n, nrows, ncols = arr.shape
        return (arr.reshape(h//nrows, -1, nrows, ncols)
                   .swapaxes(1,2)
                   .reshape(h, w))
    

    For example,

    c = np.arange(24).reshape((4,6))
    print(c)
    # [[ 0  1  2  3  4  5]
    #  [ 6  7  8  9 10 11]
    #  [12 13 14 15 16 17]
    #  [18 19 20 21 22 23]]
    
    print(blockshaped(c, 2, 3))
    # [[[ 0  1  2]
    #   [ 6  7  8]]
    
    #  [[ 3  4  5]
    #   [ 9 10 11]]
    
    #  [[12 13 14]
    #   [18 19 20]]
    
    #  [[15 16 17]
    #   [21 22 23]]]
    
    print(unblockshaped(blockshaped(c, 2, 3), 4, 6))
    # [[ 0  1  2  3  4  5]
    #  [ 6  7  8  9 10 11]
    #  [12 13 14 15 16 17]
    #  [18 19 20 21 22 23]]
    

    Note that there is also superbatfish's blockwise_view. It arranges the blocks in a different format (using more axes) but it has the advantage of (1) always returning a view and (2) being capable of handing arrays of any dimension.

提交回复
热议问题