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

前端 未结 5 659
囚心锁ツ
囚心锁ツ 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 02:44

    I hope I get you right, let's say we have a,b :

    >>> a = np.array([[1,2] ,[3,4]])
    >>> b = np.array([[5,6] ,[7,8]])
        >>> a
        array([[1, 2],
               [3, 4]])
        >>> b
        array([[5, 6],
               [7, 8]])
    

    in order to make it one big 2d array use numpy.concatenate:

    >>> c = np.concatenate((a,b), axis=1 )
    >>> c
    array([[1, 2, 5, 6],
           [3, 4, 7, 8]])
    
    0 讨论(0)
  • 2020-12-01 02:52

    Yet another (simple) approach:

    threedarray = ...
    twodarray = np.array(map(lambda x: x.flatten(), threedarray))
    print(twodarray.shape)
    
    0 讨论(0)
  • 2020-12-01 02:58

    Here is a solution that one can use if someone is wishing to create tiles of a matrix:

    from itertools import product
    import numpy as np
    def tiles(arr, nrows, ncols):
        """
        If arr is a 2D array, the returned list contains nrowsXncols numpy arrays
        with each array preserving the "physical" layout of arr.
    
        When the array shape (rows, cols) are not divisible by (nrows, ncols) then
        some of the array dimensions can change according to numpy.array_split.
    
        """
        rows, cols = arr.shape
        col_arr = np.array_split(range(cols), ncols)
        row_arr = np.array_split(range(rows), nrows)
        return [arr[r[0]: r[-1]+1, c[0]: c[-1]+1]
                         for r, c in product(row_arr, col_arr)]
    
    0 讨论(0)
  • 2020-12-01 03:04

    It works for the images I tested for now. Will if further tests are made. It is however a solution which takes no account about speed and memory usage.

    def unblockshaped(blocks, h, w):
        n, nrows, ncols = blocks.shape
        bpc = w/ncols
        bpr = h/nrows
    
        reconstructed = zeros((h,w))
        t = 0
        for i in arange(bpr):
            for j in arange(bpc):
                reconstructed[i*nrows:i*nrows+nrows,j*ncols:j*ncols+ncols] = blocks[t]
                t = t+1
        return reconstructed
    
    0 讨论(0)
  • 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.

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