code: def blk_nd_short(blk, shape):
      
      internals = (blk_1d_short(b, s) for b, s in zip(blk, shape))
      return product(*internals)
docs: Iterate trough the blocks that strictly cover an array.
  
      Iterate trough the blocks that recover the part of the array
      given by max_blk_coverage.
  
      :param blk: the N-dimensional shape of the block
      :param shape: the N-dimensional shape of the array
      :return: a generator that yields the blocks
  
      Example:
  
          >>> result = list(blk_nd_short(blk=(5,3), shape=(11, 11)))
          >>> result[0]
          (slice(0, 5, None), slice(0, 3, None))
          >>> result[1]
          (slice(0, 5, None), slice(3, 6, None))
          >>> result[-1]
          (slice(5, 10, None), slice(6, 9, None))
  
          In this case, the output of max_blk_coverage
          is (10, 9), so only this part of the array is covered
  
  
      .. seealso::
  
          :py:func:`blk_nd`
            Yields blocks of blk size until the remaining part is
            smaller than `blk` and the yields smaller blocks.