def rotation_matrix_arbitrary_axis(angle, axis):
axis = normalize_vector(axis)<EOL>a = np.cos(angle / <NUM_LIT:2>)<EOL>b, c, d = axis * np.sin(angle / <NUM_LIT:2>)<EOL>e11 = np.square(a) + np.square(b) - np.square(c) - np.square(d)<EOL>e12 = <NUM_LIT:2> * (b * c - a * d)<EOL>e13 = <NUM_LIT:2> * (b * d + a * c)<EOL>e21 = <NUM_LIT:2> * (b * c + a * d)<EOL>e22 = np.square(a) + np.square(c) - np.square(b) - np.square(d)<EOL>e23 = <NUM_LIT:2> * (c * d - a * b)<EOL>e31 = <NUM_LIT:2> * (b * d - a * c)<EOL>e32 = <NUM_LIT:2> * (c * d + a * b)<EOL>e33 = np.square(a) + np.square(d) - np.square(b) - np.square(c)<EOL>return np.array([[e11, e12, e13], [e21, e22, e23], [e31, e32, e33]])<EOL>
Return a rotation matrix of `angle` radians about `axis`.

Parameters
----------
angle : int or float
    The size of the rotation in radians.

axis : numpy.array
    A 3 element aray which represents a vector. The vector is the
    axis about which the rotation is carried out.

Returns
-------
numpy.array
    A 3x3 array representing a rotation matrix.