(matrix, axes='sxyz')
return ax, ay, az
Return Euler angles from rotation matrix for specified axis sequence.

    axes : One of 24 axis sequences as string or encoded tuple

    Note that many Euler angle triplets can describe one matrix.

    >>> R0 = euler_matrix(1, 2, 3, 'syxz')
    >>> al, be, ga = euler_from_matrix(R0, 'syxz')
    >>> R1 = euler_matrix(al, be, ga, 'syxz')
    >>> numpy.allclose(R0, R1)
    True
    >>> angles = (4*math.pi) * (numpy.random.random(3) - 0.5)
    >>> for axes in _AXES2TUPLE.keys():
    ...    R0 = euler_matrix(axes=axes, *angles)
    ...    R1 = euler_matrix(axes=axes, *euler_from_matrix(R0, axes))
    ...    if not numpy.allclose(R0, R1): print(axes, "failed")
Return Euler angles from rotation matrix for specified axis sequence.
Return Euler angles from rotation matrix for specified axis sequence .
def euler_from_matrix(matrix, axes='sxyz'):
    """Return Euler angles from rotation matrix for specified axis sequence.

    axes : One of 24 axis sequences as string or encoded tuple

    Note that many Euler angle triplets can describe one matrix.

    >>> R0 = euler_matrix(1, 2, 3, 'syxz')
    >>> al, be, ga = euler_from_matrix(R0, 'syxz')
    >>> R1 = euler_matrix(al, be, ga, 'syxz')
    >>> numpy.allclose(R0, R1)
    True
    >>> angles = (4*math.pi) * (numpy.random.random(3) - 0.5)
    >>> for axes in _AXES2TUPLE.keys():
    ...    R0 = euler_matrix(axes=axes, *angles)
    ...    R1 = euler_matrix(axes=axes, *euler_from_matrix(R0, axes))
    ...    if not numpy.allclose(R0, R1): print(axes, "failed")

    """
    try:
        firstaxis, parity, repetition, frame = _AXES2TUPLE[axes.lower()]
    except (AttributeError, KeyError):
        _TUPLE2AXES[axes]  # validation
        firstaxis, parity, repetition, frame = axes

    i = firstaxis
    j = _NEXT_AXIS[i+parity]
    k = _NEXT_AXIS[i-parity+1]

    M = numpy.array(matrix, dtype=numpy.float64, copy=False)[:3, :3]
    if repetition:
        sy = math.sqrt(M[i, j]*M[i, j] + M[i, k]*M[i, k])
        if sy > _EPS:
            ax = math.atan2( M[i, j],  M[i, k])
            ay = math.atan2( sy,       M[i, i])
            az = math.atan2( M[j, i], -M[k, i])
        else:
            ax = math.atan2(-M[j, k],  M[j, j])
            ay = math.atan2( sy,       M[i, i])
            az = 0.0
    else:
        cy = math.sqrt(M[i, i]*M[i, i] + M[j, i]*M[j, i])
        if cy > _EPS:
            ax = math.atan2( M[k, j],  M[k, k])
            ay = math.atan2(-M[k, i],  cy)
            az = math.atan2( M[j, i],  M[i, i])
        else:
            ax = math.atan2(-M[j, k],  M[j, j])
            ay = math.atan2(-M[k, i],  cy)
            az = 0.0

    if parity:
        ax, ay, az = -ax, -ay, -az
    if frame:
        ax, az = az, ax
    return ax, ay, az
def euler_from_matrix ( matrix , axes = 'sxyz' ) : try : firstaxis , parity , repetition , frame = _AXES2TUPLE [ axes . lower ( ) ] except ( AttributeError , KeyError ) : _TUPLE2AXES [ axes ] # validation firstaxis , parity , repetition , frame = axes i = firstaxis j = _NEXT_AXIS [ i + parity ] k = _NEXT_AXIS [ i - parity + 1 ] M = numpy . array ( matrix , dtype = numpy . float64 , copy = False ) [ : 3 , : 3 ] if repetition : sy = math . sqrt ( M [ i , j ] * M [ i , j ] + M [ i , k ] * M [ i , k ] ) if sy > _EPS : ax = math . atan2 ( M [ i , j ] , M [ i , k ] ) ay = math . atan2 ( sy , M [ i , i ] ) az = math . atan2 ( M [ j , i ] , - M [ k , i ] ) else : ax = math . atan2 ( - M [ j , k ] , M [ j , j ] ) ay = math . atan2 ( sy , M [ i , i ] ) az = 0.0 else : cy = math . sqrt ( M [ i , i ] * M [ i , i ] + M [ j , i ] * M [ j , i ] ) if cy > _EPS : ax = math . atan2 ( M [ k , j ] , M [ k , k ] ) ay = math . atan2 ( - M [ k , i ] , cy ) az = math . atan2 ( M [ j , i ] , M [ i , i ] ) else : ax = math . atan2 ( - M [ j , k ] , M [ j , j ] ) ay = math . atan2 ( - M [ k , i ] , cy ) az = 0.0 if parity : ax , ay , az = - ax , - ay , - az if frame : ax , az = az , ax return ax , ay , az