code: def shift_multi(
          x, wrg=0.1, hrg=0.1, is_random=False, row_index=0, col_index=1, channel_index=2, fill_mode='nearest', cval=0.,
          order=1
  ):
      
      h, w = x[0].shape[row_index], x[0].shape[col_index]
      if is_random:
          tx = np.random.uniform(-hrg, hrg) * h
          ty = np.random.uniform(-wrg, wrg) * w
      else:
          tx, ty = hrg * h, wrg * w
      translation_matrix = np.array([[1, 0, tx], [0, 1, ty], [0, 0, 1]])
  
      transform_matrix = translation_matrix  # no need to do offset
      results = []
      for data in x:
          results.append(affine_transform(data, transform_matrix, channel_index, fill_mode, cval, order))
      return np.asarray(results)
docs: Shift images with the same arguments, randomly or non-randomly.
      Usually be used for image segmentation which x=[X, Y], X and Y should be matched.
  
      Parameters
      -----------
      x : list of numpy.array
          List of images with dimension of [n_images, row, col, channel] (default).
      others : args
          See ``tl.prepro.shift``.
  
      Returns
      -------
      numpy.array
          A list of processed images.