code: def combineblocks(blks, imgsz, stpsz=None, fn=np.median):
      
  
      # Construct a vectorized append function
      def listapp(x, y):
          x.append(y)
      veclistapp = np.vectorize(listapp, otypes=[np.object_])
  
      blksz = blks.shape[:-1]
  
      if stpsz is None:
          stpsz = tuple(1 for _ in blksz)
  
      # Calculate the number of blocks that can fit in each dimension of
      # the images
      numblocks = tuple(int(np.floor((a-b)/c) + 1) for a, b, c in
                        zip_longest(imgsz, blksz, stpsz, fillvalue=1))
  
      new_shape = blksz + numblocks
      blks = np.reshape(blks, new_shape)
  
      # Construct an imgs matrix of empty lists
      imgs = np.empty(imgsz, dtype=np.object_)
      imgs.fill([])
      imgs = np.frompyfunc(list, 1, 1)(imgs)
  
      # Iterate over each block and append the values to the corresponding
      # imgs cell
      for pos in np.ndindex(numblocks):
          slices = tuple(slice(a*c, a*c + b) for a, b, c in
                         zip_longest(pos, blksz, stpsz, fillvalue=1))
          veclistapp(imgs[slices].squeeze(), blks[(Ellipsis, ) + pos].squeeze())
  
      return np.vectorize(fn, otypes=[blks.dtype])(imgs)
docs: Combine blocks from an ndarray to reconstruct ndarray signal.
  
      Parameters
      ----------
      blks : ndarray
        nd array of blocks of a signal
      imgsz : tuple
        tuple of the signal size
      stpsz : tuple, optional (default None, corresponds to steps of 1)
        tuple of step sizes between neighboring blocks
      fn : function, optional (default np.median)
        the function used to resolve multivalued cells
  
      Returns
      -------
      imgs : ndarray
        reconstructed signal, unknown pixels are returned as np.nan