docs: def marginalize(self, variables, inplace=True):
          """
          Modifies the factor with marginalized values.
  
          Parameters
          ----------
          variables: list, array-like
              List of variables over which to marginalize.
  
          inplace: boolean
              If inplace=True it will modify the factor itself, else would return
              a new factor.
  
          Returns
          -------
          DiscreteFactor or None: if inplace=True (default) returns None
                          if inplace=False returns a new `DiscreteFactor` instance.
  
          Examples
          --------
          >>> from pgmpy.factors.discrete import DiscreteFactor
          >>> phi = DiscreteFactor(['x1', 'x2', 'x3'], [2, 3, 2], range(12))
          >>> phi.marginalize(['x1', 'x3'])
          >>> phi.values
          array([ 14.,  22.,  30.])
          >>> phi.variables
          ['x2']
          """
  
          if isinstance(variables, six.string_types):
              raise TypeError("variables: Expected type list or array-like, got type str")
  
          phi = self if inplace else self.copy()
  
          for var in variables:
              if var not in phi.variables:
                  raise ValueError("{var} not in scope.".format(var=var))
  
          var_indexes = [phi.variables.index(var) for var in variables]
  
          index_to_keep = sorted(set(range(len(self.variables))) - set(var_indexes))
          phi.variables = [phi.variables[index] for index in index_to_keep]
          phi.cardinality = phi.cardinality[index_to_keep]
  
          phi.values = np.sum(phi.values, axis=tuple(var_indexes))
  
          if not inplace:
              return phi