[Numpy-discussion] Quaternion dtype for NumPy - initial implementation available

Robert Love rblove_lists at comcast.net
Wed Jul 27 23:29:08 EDT 2011


To use quaternions I find I often need conversion to/from matrices and to/from Euler angles.  Will you add that functionality?  Will you handle the left versor and right versor versions?

I have a set of pure python code I've sketched out for my needs (aerospace) but would be happy to have an intrinsic Numpy solution.


On Jul 16, 2011, at 9:50 AM, Martin Ling wrote:

> Hi all,
> 
> I have just pushed a package to GitHub which adds a quaternion dtype to
> NumPy: https://github.com/martinling/numpy_quaternion
> 
> Some backstory: on Wednesday I gave a talk at SciPy 2011 about an
> inertial sensing simulation package I have been working on
> (http://www.imusim.org/). One component I suggested might be reusable
> from that code was the quaternion math implementation, written in
> Cython. One of its features is a wrapper class for Nx4 NumPy arrays that
> supports efficient operations using arrays of quaternion values.
> 
> Travis Oliphant suggested that a quaternion dtype would be a better
> solution, and got me talking to Mark Weibe about this. With Mark's help
> I completed this initial version at yesterday's sprint session.
> 
> Incidentally, how to do something like this isn't well documented and I
> would have had little hope without both Mark's in-person help and his
> previous code (for adding a half-precision float dtype) to refer to. I
> don't know what the consensus is about whether people writing custom
> dtypes is a desirable thing, but if it is then the process needs to be
> made a lot easier. That said, the fact this is doable without patching
> the numpy core at all is really, really nice.
> 
> Example usage:
> 
>>>> import numpy as np
>>>> import quaternion
>>>> np.quaternion(1,0,0,0)
> quaternion(1, 0, 0, 0)
>>>> q1 = np.quaternion(1,2,3,4)
>>>> q2 = np.quaternion(5,6,7,8)
>>>> q1 * q2
> quaternion(-60, 12, 30, 24)
>>>> a = np.array([q1, q2])
>>>> a
> array([quaternion(1, 2, 3, 4), quaternion(5, 6, 7, 8)],
> 	dtype=quaternion)
>>>> exp(a)
> array([quaternion(1.69392, -0.78956, -1.18434, -1.57912),
>        quaternion(138.909, -25.6861, -29.9671, -34.2481)],
> 	dtype=quaternion)
> 
> The following ufuncs are implemented:
> add, subtract, multiply, divide, log, exp, power, negative, conjugate,
> copysign, equal, not_equal, less, less_equal, isnan, isinf, isfinite,
> absolute
> 
> Quaternion components are stored as doubles. The package could be extended
> to support e.g. qfloat, qdouble, qlongdouble
> 
> Comparison operations follow the same lexicographic ordering as tuples.
> 
> The unary tests isnan, isinf and isfinite return true if they would
> return true for any individual component.
> 
> Real types may be cast to quaternions, giving quaternions with zero for
> all three imaginary components. Complex types may also be cast to
> quaternions, with their single imaginary component becoming the first
> imaginary component of the quaternion. Quaternions may not be cast to
> real or complex types.
> 
> Comments very welcome. This is my first attempt at NumPy hacking :-)
> 
> 
> Martin
> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion




More information about the NumPy-Discussion mailing list