code: def save_images(images, size, image_path='_temp.png'):
      
      if len(images.shape) == 3:  # Greyscale [batch, h, w] --> [batch, h, w, 1]
          images = images[:, :, :, np.newaxis]
  
      def merge(images, size):
          h, w = images.shape[1], images.shape[2]
          img = np.zeros((h * size[0], w * size[1], 3), dtype=images.dtype)
          for idx, image in enumerate(images):
              i = idx % size[1]
              j = idx // size[1]
              img[j * h:j * h + h, i * w:i * w + w, :] = image
          return img
  
      def imsave(images, size, path):
          if np.max(images) <= 1 and (-1 <= np.min(images) < 0):
              images = ((images + 1) * 127.5).astype(np.uint8)
          elif np.max(images) <= 1 and np.min(images) >= 0:
              images = (images * 255).astype(np.uint8)
  
          return imageio.imwrite(path, merge(images, size))
  
      if len(images) > size[0] * size[1]:
          raise AssertionError("number of images should be equal or less than size[0] * size[1] {}".format(len(images)))
  
      return imsave(images, size, image_path)
docs: Save multiple images into one single image.
  
      Parameters
      -----------
      images : numpy array
          (batch, w, h, c)
      size : list of 2 ints
          row and column number.
          number of images should be equal or less than size[0] * size[1]
      image_path : str
          save path
  
      Examples
      ---------
      >>> import numpy as np
      >>> import tensorlayer as tl
      >>> images = np.random.rand(64, 100, 100, 3)
      >>> tl.visualize.save_images(images, [8, 8], 'temp.png')