code: def axis_rotation(points, angle, inplace=False, deg=True, axis='z'):
      
      axis = axis.lower()
  
      # Copy original array to if not inplace
      if not inplace:
          points = points.copy()
  
      # Convert angle to radians
      if deg:
          angle *= np.pi / 180
  
      if axis == 'x':
          y = points[:, 1] * np.cos(angle) - points[:, 2] * np.sin(angle)
          z = points[:, 1] * np.sin(angle) + points[:, 2] * np.cos(angle)
          points[:, 1] = y
          points[:, 2] = z
      elif axis == 'y':
          x = points[:, 0] * np.cos(angle) + points[:, 2] * np.sin(angle)
          z = - points[:, 0] * np.sin(angle) + points[:, 2] * np.cos(angle)
          points[:, 0] = x
          points[:, 2] = z
      elif axis == 'z':
          x = points[:, 0] * np.cos(angle) - points[:, 1] * np.sin(angle)
          y = points[:, 0] * np.sin(angle) + points[:, 1] * np.cos(angle)
          points[:, 0] = x
          points[:, 1] = y
      else:
          raise Exception('invalid axis.  Must be either "x", "y", or "z"')
  
      if not inplace:
          return points
docs: Rotates points angle ang (in deg) about an axis