class_docstr: 3D Keypoints containing Nx3 or BxNx3 points.
  
  Args:
      keypoints: Raw tensor or a list of Tensors with the Nx3 coordinates
      raise_if_not_floating_point: will raise if the Tensor isn't float
code: def __init__(
      self,
      keypoints: Union[Tensor, List[Tensor]],
      raise_if_not_floating_point: bool = True,
  ) -> None:
      self._N: Optional[List[int]] = None
  
      if isinstance(keypoints, list):
          keypoints, self._N = _merge_keypoint_list(keypoints)
  
      if not isinstance(keypoints, Tensor):
          raise TypeError(
              f"Input keypoints is not a Tensor. Got: {type(keypoints)}."
          )
  
      if not keypoints.is_floating_point():
          if raise_if_not_floating_point:
              raise ValueError(
                  f"Coordinates must be in floating point. Got {keypoints.dtype}"
              )
  
          keypoints = keypoints.float()
  
      if len(keypoints.shape) == 0:
          # Use reshape, so we don't end up creating a new tensor that does not depend on
          # the inputs (and consequently confuses jit)
          keypoints = keypoints.reshape((-1, 3))
  
      if not (
          2 <= keypoints.ndim <= 3 and keypoints.shape[-1:] == (3,)
      ):
          raise ValueError(
              f"Keypoints shape must be (N, 3) or (B, N, 3). Got {keypoints.shape}."
          )
  
      self._is_batched = False if keypoints.ndim == 2 else True
  
      self._data = keypoints
  
imports: from typing import List, Optional, Tuple, Union, cast
  import torch
  from torch import Size
  from kornia.core import Tensor
  from kornia.geometry import transform_points
label_desc: Use image node_id 1 to create a new Keypoints3D object  with example: obj = Keypoints3D(keypoints, raise_if_not_floating_point)