class_docstr: Class for an n-fold product manifold :math:`M^n`.
  
  Define a manifold as the product manifold of n copies of a given base
  manifold M.
  
  Parameters
  ----------
  space : NFoldManifold
      Base space.
  scales : array-like
      Scale of each metric in the product.
docstr: Compute the Riemannian logarithm of a point.
  
  Parameters
  ----------
  point : array-like, shape=[..., n_copies, *base_shape]
      Point on the manifold.
  base_point : array-like, shape=[..., n_copies, *base_shape]
      Point on the manifold.
      Optional, default: None.
  
  Returns
  -------
  log : array-like, shape=[..., n_copies, *base_shape]
      Tangent vector at the base point equal to the Riemannian logarithm
      of point at the base point.
docstr_tok: ["Compute","the","Riemannian","logarithm","of","a","point",".","Parameters","--","--","--","--","--","point",":","array-like",",","shape=","[","...",",","n_copies",",","*","base_shape","]","Point","on","the","manifold",".","base_point",":","array-like",",","shape=","[","...",",","n_copies",",","*","base_shape","]","Point","on","the","manifold",".","Optional",",","default",":","None",".","Returns","--","--","--","-","log",":","array-like",",","shape=","[","...",",","n_copies",",","*","base_shape","]","Tangent","vector","at","the","base","point","equal","to","the","Riemannian","logarithm","of","point","at","the","base","point","."]
code: def log(self, point, base_point):
      """Compute the Riemannian logarithm of a point.
  
      Parameters
      ----------
      point : array-like, shape=[..., n_copies, *base_shape]
          Point on the manifold.
      base_point : array-like, shape=[..., n_copies, *base_shape]
          Point on the manifold.
          Optional, default: None.
  
      Returns
      -------
      log : array-like, shape=[..., n_copies, *base_shape]
          Tangent vector at the base point equal to the Riemannian logarithm
          of point at the base point.
      """
      base_manifold = self._space.base_manifold
      batch_shape = get_batch_shape(
          self._space.point_ndim, point, base_point
      )
  
      point_, base_point_ = gs.broadcast_arrays(point, base_point)
      base_point_ = gs.reshape(base_point_, (-1, *base_manifold.shape))
      point_ = gs.reshape(point_, (-1, *base_manifold.shape))
      each_log = base_manifold.metric.log(point_, base_point_)
      return gs.reshape(each_log, batch_shape + self._space.shape)
  
imports: import geomstats.backend
  import geomstats.errors
  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 7 for calling the NFoldMetric obj's underlying member method code with example usage: obj.log(point, base_point) and returns: gs