class_docstr: Rotation in 3 dimensions.
  
  This class provides an interface to initialize from and represent rotations
  with:
  
      - Quaternions
      - Direction Cosine Matrices
      - Rotation Vectors
      - Euler angles
  
  The following operations on rotations are supported:
  
      - Application on vectors
      - Rotation Composition
      - Rotation Inversion
      - Rotation Indexing
  
  Indexing within a rotation is supported since multiple rotation transforms
  can be stored within a single `Rotation` instance.
  
  To create `Rotation` objects use `from_...` classmethods, `__init__` is not
  supposed to be used directly.
  
  Methods
  -------
  __len__
  from_quat
  from_dcm
  from_rotvec
  from_euler
  as_quat
  as_dcm
  as_rotvec
  as_euler
  apply
  __mul__
  inv
  __getitem__
  random
  
  Examples
  --------
  >>> from scipy.spatial.transform import Rotation as R
  
  A `Rotation` instance can be initialized in any of the above formats and
  converted to any of the others. The underlying object is independent of the
  representation used for initialization.
  
  Consider a counter-clockwise rotation of 90 degrees about the z-axis. This
  corresponds to the following quaternion (in scalar-last format):
  
  >>> r = R.from_quat([0, 0, np.sin(np.pi/4), np.cos(np.pi/4)])
  
  The rotation can be expressed in any of the other formats:
  
  >>> r.as_dcm()
  array([[ 2.22044605e-16, -1.00000000e+00,  0.00000000e+00],
  [ 1.00000000e+00,  2.22044605e-16,  0.00000000e+00],
  [ 0.00000000e+00,  0.00000000e+00,  1.00000000e+00]])
  >>> r.as_rotvec()
  array([0.        , 0.        , 1.57079633])
  >>> r.as_euler('zyx', degrees=True)
  array([90.,  0.,  0.])
  
  The same rotation can be initialized using a direction cosine matrix:
  
  >>> r = R.from_dcm(np.array([
  ... [0, -1, 0],
  ... [1, 0, 0],
  ... [0, 0, 1]]))
  
  Representation in other formats:
  
  >>> r.as_quat()
  array([0.        , 0.        , 0.70710678, 0.70710678])
  >>> r.as_rotvec()
  array([0.        , 0.        , 1.57079633])
  >>> r.as_euler('zyx', degrees=True)
  array([90.,  0.,  0.])
  
  The rotation vector corresponding to this rotation is given by:
  
  >>> r = R.from_rotvec(np.pi/2 * np.array([0, 0, 1]))
  
  Representation in other formats:
  
  >>> r.as_quat()
  array([0.        , 0.        , 0.70710678, 0.70710678])
  >>> r.as_dcm()
  array([[ 2.22044605e-16, -1.00000000e+00,  0.00000000e+00],
         [ 1.00000000e+00,  2.22044605e-16,  0.00000000e+00],
         [ 0.00000000e+00,  0.00000000e+00,  1.00000000e+00]])
  >>> r.as_euler('zyx', degrees=True)
  array([90.,  0.,  0.])
  
  The `from_euler` function is quite flexible in the range of input formats
  it supports. Here we initialize a single rotation about a single axis:
  
  >>> r = R.from_euler('z', 90, degrees=True)
  
  Again, the object is representation independent and can be converted to any
  other format:
  
  >>> r.as_quat()
  array([0.        , 0.        , 0.70710678, 0.70710678])
  >>> r.as_dcm()
  array([[ 2.22044605e-16, -1.00000000e+00,  0.00000000e+00],
         [ 1.00000000e+00,  2.22044605e-16,  0.00000000e+00],
         [ 0.00000000e+00,  0.00000000e+00,  1.00000000e+00]])
  >>> r.as_rotvec()
  array([0.        , 0.        , 1.57079633])
  
  It is also possible to initialize multiple rotations in a single instance
  using any of the `from_...` functions. Here we initialize a stack of 3
  rotations using the `from_euler` function:
  
  >>> r = R.from_euler('zyx', [
  ... [90, 0, 0],
  ... [0, 45, 0],
  ... [45, 60, 30]], degrees=True)
  
  The other representations also now return a stack of 3 rotations. For
  example:
  
  >>> r.as_quat()
  array([[0.        , 0.        , 0.70710678, 0.70710678],
         [0.        , 0.38268343, 0.        , 0.92387953],
         [0.39190384, 0.36042341, 0.43967974, 0.72331741]])
  
  Applying the above rotations onto a vector:
  
  >>> v = [1, 2, 3]
  >>> r.apply(v)
  array([[-2.        ,  1.        ,  3.        ],
         [ 2.82842712,  2.        ,  1.41421356],
         [ 2.24452282,  0.78093109,  2.89002836]])
  
  A `Rotation` instance can be indexed and sliced as if it were a single
  1D array or list:
  
  >>> r.as_quat()
  array([[0.        , 0.        , 0.70710678, 0.70710678],
         [0.        , 0.38268343, 0.        , 0.92387953],
         [0.39190384, 0.36042341, 0.43967974, 0.72331741]])
  >>> p = r[0]
  >>> p.as_dcm()
  array([[ 2.22044605e-16, -1.00000000e+00,  0.00000000e+00],
         [ 1.00000000e+00,  2.22044605e-16,  0.00000000e+00],
         [ 0.00000000e+00,  0.00000000e+00,  1.00000000e+00]])
  >>> q = r[1:3]
  >>> q.as_quat()
  array([[0.        , 0.38268343, 0.        , 0.92387953],
         [0.39190384, 0.36042341, 0.43967974, 0.72331741]])
  
  Multiple rotations can be composed using the `*` operator:
  
  >>> r1 = R.from_euler('z', 90, degrees=True)
  >>> r2 = R.from_rotvec([np.pi/4, 0, 0])
  >>> v = [1, 2, 3]
  >>> r2.apply(r1.apply(v))
  array([-2.        , -1.41421356,  2.82842712])
  >>> r3 = r2 * r1 # Note the order
  >>> r3.apply(v)
  array([-2.        , -1.41421356,  2.82842712])
  
  Finally, it is also possible to invert rotations:
  
  >>> r1 = R.from_euler('z', [90, 45], degrees=True)
  >>> r2 = r1.inv()
  >>> r2.as_euler('zyx', degrees=True)
  array([[-90.,   0.,   0.],
         [-45.,   0.,   0.]])
  
  These examples serve as an overview into the `Rotation` class and highlight
  major functionalities. For more thorough examples of the range of input and
  output formats supported, consult the individual method's examples.
class_docstr_tok: ["Rotation","in","3","dimensions",".","This","class","provides","an","interface","to","initialize","from","and","represent","rotations","with",":","-","Quaternions","-","Direction","Cosine","Matrices","-","Rotation","Vectors","-","Euler","angles","The","following","operations","on","rotations","are","supported",":","-","Application","on","vectors","-","Rotation","Composition","-","Rotation","Inversion","-","Rotation","Indexing","Indexing","within","a","rotation","is","supported","since","multiple","rotation","transforms","can","be","stored","within","a","single","`","Rotation","`","instance",".","To","create","`","Rotation","`","objects","use","`","from_","...","`","classmethods",",","`","__init__","`","is","not","supposed","to","be","used","directly",".","Methods","--","--","--","-","__len__","from_quat","from_dcm","from_rotvec","from_euler","as_quat","as_dcm","as_rotvec","as_euler","apply","__mul__","inv","__getitem__","random","Examples","--","--","--","--",">",">",">","from","scipy.spatial.transform","import","Rotation","as","R","A","`","Rotation","`","instance","can","be","initialized","in","any","of","the","above","formats","and","converted","to","any","of","the","others",".","The","underlying","object","is","independent","of","the","representation","used","for","initialization",".","Consider","a","counter-clockwise","rotation","of","90","degrees","about","the","z-axis",".","This","corresponds","to","the","following","quaternion","(","in","scalar-last","format",")",":",">",">",">","r","=","R.from_quat","(","[","0",",","0",",","np.sin","(","np.pi\/4",")",",","np.cos","(","np.pi\/4",")","]",")","The","rotation","can","be","expressed","in","any","of","the","other","formats",":",">",">",">","r.as_dcm","(",")","array","(","[","[","2.22044605e-16",",","-1.00000000e+00",",","0.00000000e+00","]",",","[","1.00000000e+00",",","2.22044605e-16",",","0.00000000e+00","]",",","[","0.00000000e+00",",","0.00000000e+00",",","1.00000000e+00","]","]",")",">",">",">","r.as_rotvec","(",")","array","(","[","0.",",","0.",",","1.57079633","]",")",">",">",">","r.as_euler","(","'zyx","'",",","degrees=True",")","array","(","[","90.",",","0.",",","0",".","]",")","The","same","rotation","can","be","initialized","using","a","direction","cosine","matrix",":",">",">",">","r","=","R.from_dcm","(","np.array","(","[","...","[","0",",","-1",",","0","]",",","...","[","1",",","0",",","0","]",",","...","[","0",",","0",",","1","]","]",")",")","Representation","in","other","formats",":",">",">",">","r.as_quat","(",")","array","(","[","0.",",","0.",",","0.70710678",",","0.70710678","]",")",">",">",">","r.as_rotvec","(",")","array","(","[","0.",",","0.",",","1.57079633","]",")",">",">",">","r.as_euler","(","'zyx","'",",","degrees=True",")","array","(","[","90.",",","0.",",","0",".","]",")","The","rotation","vector","corresponding","to","this","rotation","is","given","by",":",">",">",">","r","=","R.from_rotvec","(","np.pi\/2","*","np.array","(","[","0",",","0",",","1","]",")",")","Representation","in","other","formats",":",">",">",">","r.as_quat","(",")","array","(","[","0.",",","0.",",","0.70710678",",","0.70710678","]",")",">",">",">","r.as_dcm","(",")","array","(","[","[","2.22044605e-16",",","-1.00000000e+00",",","0.00000000e+00","]",",","[","1.00000000e+00",",","2.22044605e-16",",","0.00000000e+00","]",",","[","0.00000000e+00",",","0.00000000e+00",",","1.00000000e+00","]","]",")",">",">",">","r.as_euler","(","'zyx","'",",","degrees=True",")","array","(","[","90.",",","0.",",","0",".","]",")","The","`","from_euler","`","function","is","quite","flexible","in","the","range","of","input","formats","it","supports",".","Here","we","initialize","a","single","rotation","about","a","single","axis",":",">",">",">","r","=","R.from_euler","(","'","z","'",",","90",",","degrees=True",")","Again",",","the","object","is","representation","independent","and","can","be","converted","to","any","other","format",":",">",">",">","r.as_quat","(",")","array","(","[","0.",",","0.",",","0.70710678",",","0.70710678","]",")",">",">",">","r.as_dcm","(",")","array","(","[","[","2.22044605e-16",",","-1.00000000e+00",",","0.00000000e+00","]",",","[","1.00000000e+00",",","2.22044605e-16",",","0.00000000e+00","]",",","[","0.00000000e+00",",","0.00000000e+00",",","1.00000000e+00","]","]",")",">",">",">","r.as_rotvec","(",")","array","(","[","0.",",","0.",",","1.57079633","]",")","It","is","also","possible","to","initialize","multiple","rotations","in","a","single","instance","using","any","of","the","`","from_","...","`","functions",".","Here","we","initialize","a","stack","of","3","rotations","using","the","`","from_euler","`","function",":",">",">",">","r","=","R.from_euler","(","'zyx","'",",","[","...","[","90",",","0",",","0","]",",","...","[","0",",","45",",","0","]",",","...","[","45",",","60",",","30","]","]",",","degrees=True",")","The","other","representations","also","now","return","a","stack","of","3","rotations",".","For","example",":",">",">",">","r.as_quat","(",")","array","(","[","[","0.",",","0.",",","0.70710678",",","0.70710678","]",",","[","0.",",","0.38268343",",","0.",",","0.92387953","]",",","[","0.39190384",",","0.36042341",",","0.43967974",",","0.72331741","]","]",")","Applying","the","above","rotations","onto","a","vector",":",">",">",">","v","=","[","1",",","2",",","3","]",">",">",">","r.apply","(","v",")","array","(","[","[","-2.",",","1.",",","3",".","]",",","[","2.82842712",",","2.",",","1.41421356","]",",","[","2.24452282",",","0.78093109",",","2.89002836","]","]",")","A","`","Rotation","`","instance","can","be","indexed","and","sliced","as","if","it","were","a","single","1D","array","or","list",":",">",">",">","r.as_quat","(",")","array","(","[","[","0.",",","0.",",","0.70710678",",","0.70710678","]",",","[","0.",",","0.38268343",",","0.",",","0.92387953","]",",","[","0.39190384",",","0.36042341",",","0.43967974",",","0.72331741","]","]",")",">",">",">","p","=","r","[","0","]",">",">",">","p.as_dcm","(",")","array","(","[","[","2.22044605e-16",",","-1.00000000e+00",",","0.00000000e+00","]",",","[","1.00000000e+00",",","2.22044605e-16",",","0.00000000e+00","]",",","[","0.00000000e+00",",","0.00000000e+00",",","1.00000000e+00","]","]",")",">",">",">","q","=","r","[","1:3","]",">",">",">","q.as_quat","(",")","array","(","[","[","0.",",","0.38268343",",","0.",",","0.92387953","]",",","[","0.39190384",",","0.36042341",",","0.43967974",",","0.72331741","]","]",")","Multiple","rotations","can","be","composed","using","the","`","*","`","operator",":",">",">",">","r1","=","R.from_euler","(","'","z","'",",","90",",","degrees=True",")",">",">",">","r2","=","R.from_rotvec","(","[","np.pi\/4",",","0",",","0","]",")",">",">",">","v","=","[","1",",","2",",","3","]",">",">",">","r2.apply","(","r1.apply","(","v",")",")","array","(","[","-2.",",","-1.41421356",",","2.82842712","]",")",">",">",">","r3","=","r2","*","r1","#","Note","the","order",">",">",">","r3.apply","(","v",")","array","(","[","-2.",",","-1.41421356",",","2.82842712","]",")","Finally",",","it","is","also","possible","to","invert","rotations",":",">",">",">","r1","=","R.from_euler","(","'","z","'",",","[","90",",","45","]",",","degrees=True",")",">",">",">","r2","=","r1.inv","(",")",">",">",">","r2.as_euler","(","'zyx","'",",","degrees=True",")","array","(","[","[","-90.",",","0.",",","0",".","]",",","[","-45.",",","0.",",","0",".","]","]",")","These","examples","serve","as","an","overview","into","the","`","Rotation","`","class","and","highlight","major","functionalities",".","For","more","thorough","examples","of","the","range","of","input","and","output","formats","supported",",","consult","the","individual","method","'s","examples","."]
docstr: Represent as Euler angles.
  
  Any orientation can be expressed as a composition of 3 elementary
  rotations. Once the axis sequence has been chosen, Euler angles define
  the angle of rotation around each respective axis [1]_.
  
  The algorithm from [2]_ has been used to calculate Euler angles for the
  rotation about a given sequence of axes.
  
  Euler angles suffer from the problem of gimbal lock [3]_, where the
  representation loses a degree of freedom and it is not possible to
  determine the first and third angles uniquely. In this case,
  a warning is raised, and the third angle is set to zero. Note however
  that the returned angles still represent the correct rotation.
  
  Parameters
  ----------
  seq : string, length 3
      3 characters belonging to the set {'X', 'Y', 'Z'} for intrinsic
      rotations, or {'x', 'y', 'z'} for extrinsic rotations [1]_.
      Adjacent axes cannot be the same.
      Extrinsic and intrinsic rotations cannot be mixed in one function
      call.
  degrees : boolean, optional
      Returned angles are in degrees if this flag is True, else they are
      in radians. Default is False.
  
  Returns
  -------
  angles : `numpy.ndarray`, shape (3,) or (N, 3)
      Shape depends on shape of inputs used to initialize object.
  
      The returned angles are in the range:
  
          - First angle belongs to [-180, 180] degrees (both inclusive)
          - Third angle belongs to [-180, 180] degrees (both inclusive)
          - Second angle belongs to:
  
              - [-90, 90] degrees if all axes are different (like xyz)
              - [0, 180] degrees if first and third axes are the same
                (like zxz)
  
  References
  ----------
  .. [1] `Euler angle definitions
          <https://en.wikipedia.org/wiki/Euler_angles#Definition_by_intrinsic_rotations>`_
  .. [2] Malcolm D. Shuster, F. Landis Markley
          `General Formula for Euler Angles
          <https://arc.aiaa.org/doi/abs/10.2514/1.16622>`_
  .. [3] `Gimbal lock
          <https://en.wikipedia.org/wiki/Gimbal_lock#In_applied_mathematics>`_
  
  Examples
  --------
  >>> from scipy.spatial.transform import Rotation as R
  
  Represent a single rotation:
  
  >>> r = R.from_rotvec([0, 0, np.pi/2])
  >>> r.as_euler('zxy', degrees=True)
  array([90.,  0.,  0.])
  >>> r.as_euler('zxy', degrees=True).shape
  (3,)
  
  Represent a stack of single rotation:
  
  >>> r = R.from_rotvec([[0, 0, np.pi/2]])
  >>> r.as_euler('zxy', degrees=True)
  array([[90.,  0.,  0.]])
  >>> r.as_euler('zxy', degrees=True).shape
  (1, 3)
  
  Represent multiple rotations in a single object:
  
  >>> r = R.from_rotvec([
  ... [0, 0, np.pi/2],
  ... [0, -np.pi/3, 0],
  ... [np.pi/4, 0, 0]])
  >>> r.as_euler('zxy', degrees=True)
  array([[ 90.,   0.,   0.],
         [  0.,   0., -60.],
         [  0.,  45.,   0.]])
  >>> r.as_euler('zxy', degrees=True).shape
  (3, 3)
docstr_tok: ["Represent","as","Euler","angles",".","Any","orientation","can","be","expressed","as","a","composition","of","3","elementary","rotations",".","Once","the","axis","sequence","has","been","chosen",",","Euler","angles","define","the","angle","of","rotation","around","each","respective","axis","[","1","]","_",".","The","algorithm","from","[","2","]","_","has","been","used","to","calculate","Euler","angles","for","the","rotation","about","a","given","sequence","of","axes",".","Euler","angles","suffer","from","the","problem","of","gimbal","lock","[","3","]","_",",","where","the","representation","loses","a","degree","of","freedom","and","it","is","not","possible","to","determine","the","first","and","third","angles","uniquely",".","In","this","case",",","a","warning","is","raised",",","and","the","third","angle","is","set","to","zero",".","Note","however","that","the","returned","angles","still","represent","the","correct","rotation",".","Parameters","--","--","--","--","--","seq",":","string",",","length","3","3","characters","belonging","to","the","set","{","'","X","'",",","'","Y","'",",","'","Z","'","}","for","intrinsic","rotations",",","or","{","'","x","'",",","'","y","'",",","'","z","'","}","for","extrinsic","rotations","[","1","]","_",".","Adjacent","axes","can","not","be","the","same",".","Extrinsic","and","intrinsic","rotations","can","not","be","mixed","in","one","function","call",".","degrees",":","boolean",",","optional","Returned","angles","are","in","degrees","if","this","flag","is","True",",","else","they","are","in","radians",".","Default","is","False",".","Returns","--","--","--","-","angles",":","`","numpy.ndarray","`",",","shape","(","3",",",")","or","(","N",",","3",")","Shape","depends","on","shape","of","inputs","used","to","initialize","object",".","The","returned","angles","are","in","the","range",":","-","First","angle","belongs","to","[","-180",",","180","]","degrees","(","both","inclusive",")","-","Third","angle","belongs","to","[","-180",",","180","]","degrees","(","both","inclusive",")","-","Second","angle","belongs","to",":","-","[","-90",",","90","]","degrees","if","all","axes","are","different","(","like","xyz",")","-","[","0",",","180","]","degrees","if","first","and","third","axes","are","the","same","(","like","zxz",")","References","--","--","--","--","--","..","[","1","]","`","Euler","angle","definitions","<","https",":","\/\/en.wikipedia.org\/wiki\/Euler_angles","#","Definition_by_intrinsic_rotations",">","`","_","..","[","2","]","Malcolm","D.","Shuster",",","F.","Landis","Markley","`","General","Formula","for","Euler","Angles","<","https",":","\/\/arc.aiaa.org\/doi\/abs\/10.2514\/1.16622",">","`","_","..","[","3","]","`","Gimbal","lock","<","https",":","\/\/en.wikipedia.org\/wiki\/Gimbal_lock","#","In_applied_mathematics",">","`","_","Examples","--","--","--","--",">",">",">","from","scipy.spatial.transform","import","Rotation","as","R","Represent","a","single","rotation",":",">",">",">","r","=","R.from_rotvec","(","[","0",",","0",",","np.pi\/2","]",")",">",">",">","r.as_euler","(","'zxy","'",",","degrees=True",")","array","(","[","90.",",","0.",",","0",".","]",")",">",">",">","r.as_euler","(","'zxy","'",",","degrees=True",")",".shape","(","3",",",")","Represent","a","stack","of","single","rotation",":",">",">",">","r","=","R.from_rotvec","(","[","[","0",",","0",",","np.pi\/2","]","]",")",">",">",">","r.as_euler","(","'zxy","'",",","degrees=True",")","array","(","[","[","90.",",","0.",",","0",".","]","]",")",">",">",">","r.as_euler","(","'zxy","'",",","degrees=True",")",".shape","(","1",",","3",")","Represent","multiple","rotations","in","a","single","object",":",">",">",">","r","=","R.from_rotvec","(","[","...","[","0",",","0",",","np.pi\/2","]",",","...","[","0",",","-np.pi\/3",",","0","]",",","...","[","np.pi\/4",",","0",",","0","]","]",")",">",">",">","r.as_euler","(","'zxy","'",",","degrees=True",")","array","(","[","[","90.",",","0.",",","0",".","]",",","[","0.",",","0.",",","-60",".","]",",","[","0.",",","45.",",","0",".","]","]",")",">",">",">","r.as_euler","(","'zxy","'",",","degrees=True",")",".shape","(","3",",","3",")"]
code: def as_euler(self, seq, degrees=False):
      """Represent as Euler angles.
  
      Any orientation can be expressed as a composition of 3 elementary
      rotations. Once the axis sequence has been chosen, Euler angles define
      the angle of rotation around each respective axis [1]_.
  
      The algorithm from [2]_ has been used to calculate Euler angles for the
      rotation about a given sequence of axes.
  
      Euler angles suffer from the problem of gimbal lock [3]_, where the
      representation loses a degree of freedom and it is not possible to
      determine the first and third angles uniquely. In this case,
      a warning is raised, and the third angle is set to zero. Note however
      that the returned angles still represent the correct rotation.
  
      Parameters
      ----------
      seq : string, length 3
          3 characters belonging to the set {'X', 'Y', 'Z'} for intrinsic
          rotations, or {'x', 'y', 'z'} for extrinsic rotations [1]_.
          Adjacent axes cannot be the same.
          Extrinsic and intrinsic rotations cannot be mixed in one function
          call.
      degrees : boolean, optional
          Returned angles are in degrees if this flag is True, else they are
          in radians. Default is False.
  
      Returns
      -------
      angles : `numpy.ndarray`, shape (3,) or (N, 3)
          Shape depends on shape of inputs used to initialize object.
  
          The returned angles are in the range:
  
              - First angle belongs to [-180, 180] degrees (both inclusive)
              - Third angle belongs to [-180, 180] degrees (both inclusive)
              - Second angle belongs to:
  
                  - [-90, 90] degrees if all axes are different (like xyz)
                  - [0, 180] degrees if first and third axes are the same
                    (like zxz)
  
      References
      ----------
      .. [1] `Euler angle definitions
              <https://en.wikipedia.org/wiki/Euler_angles#Definition_by_intrinsic_rotations>`_
      .. [2] Malcolm D. Shuster, F. Landis Markley
              `General Formula for Euler Angles
              <https://arc.aiaa.org/doi/abs/10.2514/1.16622>`_
      .. [3] `Gimbal lock
              <https://en.wikipedia.org/wiki/Gimbal_lock#In_applied_mathematics>`_
  
      Examples
      --------
      >>> from scipy.spatial.transform import Rotation as R
  
      Represent a single rotation:
  
      >>> r = R.from_rotvec([0, 0, np.pi/2])
      >>> r.as_euler('zxy', degrees=True)
      array([90.,  0.,  0.])
      >>> r.as_euler('zxy', degrees=True).shape
      (3,)
  
      Represent a stack of single rotation:
  
      >>> r = R.from_rotvec([[0, 0, np.pi/2]])
      >>> r.as_euler('zxy', degrees=True)
      array([[90.,  0.,  0.]])
      >>> r.as_euler('zxy', degrees=True).shape
      (1, 3)
  
      Represent multiple rotations in a single object:
  
      >>> r = R.from_rotvec([
      ... [0, 0, np.pi/2],
      ... [0, -np.pi/3, 0],
      ... [np.pi/4, 0, 0]])
      >>> r.as_euler('zxy', degrees=True)
      array([[ 90.,   0.,   0.],
             [  0.,   0., -60.],
             [  0.,  45.,   0.]])
      >>> r.as_euler('zxy', degrees=True).shape
      (3, 3)
  
      """
      if len(seq) != 3:
          raise ValueError("Expected 3 axes, got {}.".format(seq))
  
      intrinsic = re.match(r"^[XYZ]{1,3}$", seq) is not None
      extrinsic = re.match(r"^[xyz]{1,3}$", seq) is not None
      if not (intrinsic or extrinsic):
          raise ValueError(
              "Expected axes from `seq` to be from "
              "['x', 'y', 'z'] or ['X', 'Y', 'Z'], "
              "got {}".format(seq)
          )
  
      if any(seq[i] == seq[i + 1] for i in range(2)):
          raise ValueError(
              "Expected consecutive axes to be different, "
              "got {}".format(seq)
          )
  
      seq = seq.lower()
  
      angles = _compute_euler_from_dcm(self.as_dcm(), seq, extrinsic)
      if degrees:
          angles = np.rad2deg(angles)
  
      return angles[0] if self._single else angles
  
imports: from __future__ import division, print_function, absolute_import
  import re
  import warnings
  import numpy
  import scipy.linalg
  from scipy._lib._util import check_random_state
label_desc: Use image node_id 10 for calling the Rotation obj's underlying member method code with example usage: obj.as_euler(seq, degrees) and returns: unknown