docstr: This transform is used to flip sparse coords using a given axis. Usually, it would be x or y
  
  Parameters
  ----------
  ignored_axis: str
      Axis to be chosen between x, y, z
  is_temporal : bool
      Used to indicate if the pointcloud is actually 4 dimensional
  
  Returns
  -------
  data: Data
      Returns the same data object with only one point per voxel
docstr_tok: ["This","transform","is","used","to","flip","sparse","coords","using","a","given","axis",".","Usually",",","it","would","be","x","or","y","Parameters","--","--","--","--","--","ignored_axis",":","str","Axis","to","be","chosen","between","x",",","y",",","z","is_temporal",":","bool","Used","to","indicate","if","the","pointcloud","is","actually","4","dimensional","Returns","--","--","--","-","data",":","Data","Returns","the","same","data","object","with","only","one","point","per","voxel"]
code: def __init__(self, ignored_axis, is_temporal=False, p=0.95):
      """This transform is used to flip sparse coords using a given axis. Usually, it would be x or y
  
      Parameters
      ----------
      ignored_axis: str
          Axis to be chosen between x, y, z
      is_temporal : bool
          Used to indicate if the pointcloud is actually 4 dimensional
  
      Returns
      -------
      data: Data
          Returns the same data object with only one point per voxel
      """
      assert (
          0 <= p <= 1
      ), "p should be within 0 and 1. Higher probability reduce chance of flipping"
      self._is_temporal = is_temporal
      self._D = 4 if is_temporal else 3
      mapping = {"x": 0, "y": 1, "z": 2}
      self._ignored_axis = [mapping[axis] for axis in ignored_axis]
      # Use the rest of axes for flipping.
      self._horz_axes = set(range(self._D)) - set(self._ignored_axis)
      self._p = p
  
imports: from typing import List
  import itertools
  import numpy
  import math
  import re
  import torch
  import scipy
  import random
  from tqdm.auto import tqdm
  from torch.nn import functional
  from functools import partial
  from torch_geometric.nn import fps, radius, knn, voxel_grid
  from torch_geometric.nn.pool.consecutive import consecutive_cluster
  from torch_geometric.nn.pool.pool import pool_pos, pool_batch
  from torch_scatter import scatter_add, scatter_mean
  from torch_cluster import grid_cluster
  from torch_points3d.datasets.multiscale_data import MultiScaleData
  from torch_points3d.utils.config import is_list
  from torch_points3d.utils import is_iterable
  from .grid_transform import group_data, GridSampling3D, shuffle_data
label_desc: Use image node_id 1 to create a new RandomCoordsFlip object from inherited base classes: object with example: obj = RandomCoordsFlip(ignored_axis, is_temporal, p)