code: def _from_numpy(data, origin=None, spacing=None, direction=None, has_components=False, is_rgb=False):
      
      if is_rgb: has_components = True
      ndim = data.ndim
      if has_components:
          ndim -= 1
      dtype = data.dtype.name
      ptype = _npy_to_itk_map[dtype]
  
      data = np.array(data)
  
      if origin is None: origin = tuple([0.]*ndim)
      if spacing is None: spacing = tuple([1.]*ndim)
      if direction is None: direction = np.eye(ndim)
  
      libfn = utils.get_lib_fn('fromNumpy%s%i' % (_ntype_type_map[dtype], ndim))
  
      if not has_components:
          itk_image = libfn(data, data.shape[::-1])
          ants_image = iio.ANTsImage(pixeltype=ptype, dimension=ndim, components=1, pointer=itk_image)
          ants_image.set_origin(origin)
          ants_image.set_spacing(spacing)
          ants_image.set_direction(direction)
          ants_image._ndarr = data
      else:
          arrays = [data[i,...].copy() for i in range(data.shape[0])]
          data_shape = arrays[0].shape
          ants_images = []
          for i in range(len(arrays)):
              tmp_ptr = libfn(arrays[i], data_shape[::-1])
              tmp_img = iio.ANTsImage(pixeltype=ptype,
                                      dimension=ndim,
                                      components=1,
                                      pointer=tmp_ptr)
              tmp_img.set_origin(origin)
              tmp_img.set_spacing(spacing)
              tmp_img.set_direction(direction)
              tmp_img._ndarr = arrays[i]
              ants_images.append(tmp_img)
          ants_image = utils.merge_channels(ants_images)
          if is_rgb: ants_image = ants_image.vector_to_rgb()
      return ants_image
docs: Internal function for creating an ANTsImage