code: def view_as_blocks(arr_in, block_shape):
      """Block view of the input n-dimensional array (using re-striding).
  
      Blocks are non-overlapping views of the input array.
  
      Parameters
      ----------
      arr_in : ndarray, shape (M[, ...])
          Input array.
      block_shape : tuple
          The shape of the block. Each dimension must divide evenly into the
          corresponding dimensions of `arr_in`.
  
      Returns
      -------
      arr_out : ndarray
          Block view of the input array.
  
      Examples
      --------
      >>> import numpy as np
      >>> from skimage.util.shape import view_as_blocks
      >>> A = np.arange(4*4).reshape(4,4)
      >>> A
      array([[ 0,  1,  2,  3],
             [ 4,  5,  6,  7],
             [ 8,  9, 10, 11],
             [12, 13, 14, 15]])
      >>> B = view_as_blocks(A, block_shape=(2, 2))
      >>> B[0, 0]
      array([[0, 1],
             [4, 5]])
      >>> B[0, 1]
      array([[2, 3],
             [6, 7]])
      >>> B[1, 0, 1, 1]
      13
  
      >>> A = np.arange(4*4*6).reshape(4,4,6)
      >>> A  # doctest: +NORMALIZE_WHITESPACE
      array([[[ 0,  1,  2,  3,  4,  5],
              [ 6,  7,  8,  9, 10, 11],
              [12, 13, 14, 15, 16, 17],
              [18, 19, 20, 21, 22, 23]],
             [[24, 25, 26, 27, 28, 29],
              [30, 31, 32, 33, 34, 35],
              [36, 37, 38, 39, 40, 41],
              [42, 43, 44, 45, 46, 47]],
             [[48, 49, 50, 51, 52, 53],
              [54, 55, 56, 57, 58, 59],
              [60, 61, 62, 63, 64, 65],
              [66, 67, 68, 69, 70, 71]],
             [[72, 73, 74, 75, 76, 77],
              [78, 79, 80, 81, 82, 83],
              [84, 85, 86, 87, 88, 89],
              [90, 91, 92, 93, 94, 95]]])
      >>> B = view_as_blocks(A, block_shape=(1, 2, 2))
      >>> B.shape
      (4, 2, 3, 1, 2, 2)
      >>> B[2:, 0, 2]  # doctest: +NORMALIZE_WHITESPACE
      array([[[[52, 53],
               [58, 59]]],
             [[[76, 77],
               [82, 83]]]])
      """
      if not isinstance(block_shape, tuple):
          raise TypeError("block needs to be a tuple")
  
      block_shape = np.array(block_shape)
      if (block_shape <= 0).any():
          raise ValueError(
              "'block_shape' elements must be strictly positive"
          )
  
      if block_shape.size != arr_in.ndim:
          raise ValueError(
              "'block_shape' must have the same length "
              "as 'arr_in.shape'"
          )
  
      arr_shape = np.array(arr_in.shape)
      if (arr_shape % block_shape).sum() != 0:
          raise ValueError(
              "'block_shape' is not compatible with 'arr_in'"
          )
  
      # -- restride the array to build the block view
      new_shape = tuple(arr_shape // block_shape) + tuple(block_shape)
      new_strides = tuple(arr_in.strides * block_shape) + arr_in.strides
  
      arr_out = as_strided(arr_in, shape=new_shape, strides=new_strides)
  
      return arr_out
  
imports: import numbers
  import numpy
  from numpy.lib.stride_tricks import as_strided
label_desc: Use image node_id 1 for calling a global function with example usage: view_as_blocks(arr_in, block_shape) and returns: arr_out