docstr: Map a point in each factor to a point in the product.
  
  Parameters
  ----------
  points : list
      A list of points, one from each factor, each array-like of shape
      (..., factor.shape)
  
  Returns
  -------
  point : array-like, shape (..., shape)
  
  Raises
  ------
  ShapeError
      If the points are not compatible with the shapes of the corresponding
      factors.
docstr_tok: ["Map","a","point","in","each","factor","to","a","point","in","the","product",".","Parameters","--","--","--","--","--","points",":","list","A","list","of","points",",","one","from","each","factor",",","each","array-like","of","shape","(","...",",","factor.shape",")","Returns","--","--","--","-","point",":","array-like",",","shape","(","...",",","shape",")","Raises","--","--","--","ShapeError","If","the","points","are","not","compatible","with","the","shapes","of","the","corresponding","factors","."]
code: def embed_to_product(self, points):
      """Map a point in each factor to a point in the product.
  
      Parameters
      ----------
      points : list
          A list of points, one from each factor, each array-like of shape
          (..., factor.shape)
  
      Returns
      -------
      point : array-like, shape (..., shape)
  
      Raises
      ------
      ShapeError
          If the points are not compatible with the shapes of the corresponding
          factors.
      """
      for point, factor in zip(points, self.factors):
          geomstats.errors.check_point_shape(point, factor)
  
      if self.default_point_type == "vector":
          points_ = []
          for point, factor in zip(points, self.factors):
              if gs.ndim(point) > len(factor.shape):
                  batch_shape = get_batch_shape(
                      factor.point_ndim, point
                  )
                  point = gs.reshape(point, batch_shape + (-1,))
              else:
                  point = gs.flatten(point)
  
              points_.append(point)
          return gs.concatenate(points_, axis=-1)
      stacking_axis = -1 * len(self.shape)
      return gs.stack(points, axis=stacking_axis)
  
imports: import math
  import geomstats.backend
  import geomstats.errors
  from geomstats.geometry.complex_manifold import ComplexManifold
  from geomstats.geometry.complex_riemannian_metric import ComplexRiemannianMetric
  from geomstats.geometry.manifold import Manifold
  from geomstats.geometry.riemannian_metric import RiemannianMetric
  from geomstats.vectorization import get_batch_shape
label_desc: Use image node_id 2 for calling the _IterateOverFactorsMixins obj's underlying member method code with example usage: obj.embed_to_product(points) and returns: gs, gs