class_docstr: Points on the unit sphere.
  
  A HemiSphere is similar to a Sphere but it takes antipodal symmetry into
  account. Antipodal symmetry means that point v on a HemiSphere is the same
  as the point -v. Duplicate points are discarded when constructing a
  HemiSphere (including antipodal duplicates). `edges` and `faces` are
  remapped to the remaining points as closely as possible.
  
  The HemiSphere can be constructed using one of three conventions::
  
    HemiSphere(x, y, z)
    HemiSphere(xyz=xyz)
    HemiSphere(theta=theta, phi=phi)
  
  Parameters
  ----------
  x, y, z : 1-D array_like
      Vertices as x-y-z coordinates.
  theta, phi : 1-D array_like
      Vertices as spherical coordinates.  Theta and phi are the inclination
      and azimuth angles respectively.
  xyz : (N, 3) ndarray
      Vertices as x-y-z coordinates.
  faces : (N, 3) ndarray
      Indices into vertices that form triangular faces.  If unspecified,
      the faces are computed using a Delaunay triangulation.
  edges : (N, 2) ndarray
      Edges between vertices.  If unspecified, the edges are
      derived from the faces.
  tol : float
      Angle in degrees. Vertices that are less than tol degrees apart are
      treated as duplicates.
  
  See Also
  --------
  Sphere
docstr: Create a HemiSphere from points
code: def __init__(
      self,
      x=None,
      y=None,
      z=None,
      theta=None,
      phi=None,
      xyz=None,
      faces=None,
      edges=None,
      tol=1e-5,
  ):
      """Create a HemiSphere from points"""
  
      sphere = Sphere(x=x, y=y, z=z, theta=theta, phi=phi, xyz=xyz)
      uniq_vertices, mapping = remove_similar_vertices(
          sphere.vertices, tol, return_mapping=True
      )
      uniq_vertices *= 1 - 2 * (uniq_vertices[:, -1:] < 0)
      if faces is not None:
          faces = np.asarray(faces)
          faces = unique_sets(mapping[faces])
      if edges is not None:
          edges = np.asarray(edges)
          edges = unique_sets(mapping[edges])
      Sphere.__init__(self, xyz=uniq_vertices, edges=edges, faces=faces)
  
imports: import numpy
  import warnings
  from scipy import optimize
  from dipy.core.geometry import cart2sphere, sphere2cart, vector_norm
  from dipy.core.onetime import auto_attr
  from dipy.reconst.recspeed import remove_similar_vertices
label_desc: Use image node_id 1 to create a new HemiSphere object from inherited base classes: Sphere with example: obj = HemiSphere(x, y, z, theta, phi, xyz, faces, edges, tol)