numpy-quaternion


Namenumpy-quaternion JSON
Version 2024.0.3 PyPI version JSON
download
home_pagehttps://github.com/moble/quaternion
SummaryAdd a quaternion dtype to NumPy
upload_time2024-10-29 20:16:00
maintainerNone
docs_urlNone
authorMichael Boyle
requires_python>=3.10
licenseThe MIT License (MIT) Copyright (c) 2024 Michael Boyle Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            [![Test Status](https://github.com/moble/quaternion/workflows/tests/badge.svg)](https://github.com/moble/quaternion/actions)
[![Documentation Status](https://readthedocs.org/projects/quaternion/badge/?version=latest)](https://quaternion.readthedocs.io/en/latest/?badge=latest)
[![PyPI Version](https://img.shields.io/pypi/v/numpy-quaternion?color=)](https://pypi.org/project/numpy-quaternion/)
[![Conda Version](https://img.shields.io/conda/vn/conda-forge/quaternion.svg?color=)](https://anaconda.org/conda-forge/quaternion)
[![MIT License](https://img.shields.io/github/license/moble/quaternion.svg)](https://github.com/moble/quaternion/blob/main/LICENSE)
[![DOI](https://zenodo.org/badge/27896013.svg)](https://zenodo.org/badge/latestdoi/27896013)


# Quaternions in numpy

This Python module adds a quaternion dtype to NumPy.

The code was originally based on [code by Martin
Ling](https://github.com/martinling/numpy_quaternion) (which he wrote
with help from Mark Wiebe), but was rewritten with ideas from
[rational](https://github.com/numpy/numpy-dtypes/tree/master/npytypes/rational)
to work with newer python versions (and to fix a few bugs), and
*greatly* expands the applications of quaternions.

See also the pure-python package
[quaternionic](https://github.com/moble/quaternionic).

## Quickstart

```sh
conda install -c conda-forge quaternion
```

or

```sh
python -m pip install --upgrade --force-reinstall numpy-quaternion
```

Optionally add `--user` after `install` in the second command if
you're not using a python environment — though you should start.


## Installation

Assuming you use `conda` to manage your python installation (which is
currently the preferred choice for science and engineering with
python), you can install this package simply as

```sh
conda install -c conda-forge quaternion
```

If you prefer to use `pip`, you can instead do

```sh
python -m pip install --upgrade --force-reinstall numpy-quaternion
```

(See [here](https://snarky.ca/why-you-should-use-python-m-pip/) for a
veteran python core contributor's explanation of why you should always
use `python -m pip` instead of just `pip` or `pip3`.)  The `--upgrade
--force-reinstall` options are not always necessary, but will ensure
that pip will update numpy if it has to.

If you refuse to use `conda`, you might want to install inside your
home directory without root privileges.  (Conda does this by default
anyway.)  This is done by adding `--user` to the above command:

```sh
python -m pip install --user --upgrade --force-reinstall numpy-quaternion
```

Note that pip will attempt to compile the code — which requires a
working `C` compiler.

Finally, there's also the fully manual option of just downloading the
code, changing to the code directory, and running

```sh
python -m pip install --upgrade --force-reinstall .
```

This should work regardless of the installation method, as long as you
have a compiler hanging around.


## Basic usage

The full documentation can be found on [Read the
Docs](https://quaternion.readthedocs.io/), and most functions have
docstrings that should explain the relevant points.  The following are
mostly for the purposes of example.

```python
>>> 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)
>>> np.exp(a)
array([quaternion(1.69392, -0.78956, -1.18434, -1.57912),
       quaternion(138.909, -25.6861, -29.9671, -34.2481)], dtype=quaternion)
```

Note that this package represents a quaternion as a scalar, followed
by the `x` component of the vector part, followed by `y`, followed by
`z`.  These components can be accessed directly:
```python
>>> q1.w, q1.x, q1.y, q1.z
(1.0, 2.0, 3.0, 4.0)
```
However, this only works on an individual `quaternion`; for arrays it
is better to use "vectorized" operations like `as_float_array`.

The following ufuncs are implemented (which means they run fast on
numpy arrays):
```python
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 double-precision floating point
numbers — `float`s, in python language, or `float64` in more precise
numpy language.  Numpy arrays with `dtype=quaternion` can be accessed
as arrays of doubles without any (slow, memory-consuming) copying of
data; rather, a `view` of the exact same memory space can be created
within a microsecond, regardless of the shape or size of the
quaternion array.

Comparison operations follow the same lexicographic ordering as
tuples.

The unary tests isnan and isinf return true if they would return true
for any individual component; isfinite returns true if it would return
true for all components.

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.

Several array-conversion functions are also included.  For example, to
convert an Nx4 array of floats to an N-dimensional array of
quaternions, use `as_quat_array`:
```python
>>> import numpy as np
>>> import quaternion
>>> a = np.random.rand(7, 4)
>>> a
array([[ 0.93138726,  0.46972279,  0.18706385,  0.86605021],
       [ 0.70633523,  0.69982741,  0.93303559,  0.61440879],
       [ 0.79334456,  0.65912598,  0.0711557 ,  0.46622885],
       [ 0.88185987,  0.9391296 ,  0.73670503,  0.27115149],
       [ 0.49176628,  0.56688076,  0.13216632,  0.33309146],
       [ 0.11951624,  0.86804078,  0.77968826,  0.37229404],
       [ 0.33187593,  0.53391165,  0.8577846 ,  0.18336855]])
>>> qs = quaternion.as_quat_array(a)
>>> qs
array([ quaternion(0.931387262880247, 0.469722787598354, 0.187063852060487, 0.866050210100621),
       quaternion(0.706335233363319, 0.69982740767353, 0.933035590130247, 0.614408786768725),
       quaternion(0.793344561317281, 0.659125976566815, 0.0711557025000925, 0.466228847713644),
       quaternion(0.881859869074069, 0.939129602918467, 0.736705031709562, 0.271151494174001),
       quaternion(0.491766284854505, 0.566880763189927, 0.132166320200012, 0.333091463422536),
       quaternion(0.119516238634238, 0.86804077992676, 0.779688263524229, 0.372294043850009),
       quaternion(0.331875925159073, 0.533911652483908, 0.857784598617977, 0.183368547490701)], dtype=quaternion)
```
[Note that quaternions are printed with full precision, unlike floats,
which is why you see extra digits above.  But the actual data is
identical in the two cases.]  To convert an N-dimensional array of
quaternions to an Nx4 array of floats, use `as_float_array`:
```python
>>> b = quaternion.as_float_array(qs)
>>> b
array([[ 0.93138726,  0.46972279,  0.18706385,  0.86605021],
       [ 0.70633523,  0.69982741,  0.93303559,  0.61440879],
       [ 0.79334456,  0.65912598,  0.0711557 ,  0.46622885],
       [ 0.88185987,  0.9391296 ,  0.73670503,  0.27115149],
       [ 0.49176628,  0.56688076,  0.13216632,  0.33309146],
       [ 0.11951624,  0.86804078,  0.77968826,  0.37229404],
       [ 0.33187593,  0.53391165,  0.8577846 ,  0.18336855]])
```

It is also possible to convert a quaternion to or from a 3x3 array of
floats representing a rotation matrix, or an array of N quaternions to
or from an Nx3x3 array of floats representing N rotation matrices,
using `as_rotation_matrix` and `from_rotation_matrix`.  Similar
conversions are possible for rotation vectors using
`as_rotation_vector` and `from_rotation_vector`, and for spherical
coordinates using `as_spherical_coords` and `from_spherical_coords`.
Finally, it is possible to derive the Euler angles from a quaternion
using `as_euler_angles`, or create a quaternion from Euler angles
using `from_euler_angles` — though be aware that Euler angles are
basically the worst things
ever.<sup>[1](#1-euler-angles-are-awful)</sup> Before you complain
about those functions using something other than your favorite
conventions, please read [this
page](https://github.com/moble/quaternion/wiki/Euler-angles-are-horrible).


## Dependencies

With the standard installation methods, hopefully you won't need to
worry about dependencies directly.  But in case you do, here's what
you need to know.

The basic requirements for this code are reasonably current versions
of `python` and `numpy`.  In particular, `python` versions 3.10
through 3.12 are routinely tested.  Because of its crucial dependence
on `numpy`, this package can only support versions of `python` that
are directly supported by `numpy` — which limits support to releases
from the past few years.  Old versions of `python` will work with
*older* versions of this package, which are still available from PyPI
and conda-forge.  Some older versions of `python` may still work with
newer versions of this package, but your mileage may vary.

However, certain advanced functions in this package (including
`squad`, `mean_rotor_in_intrinsic_metric`,
`integrate_angular_velocity`, and related functions) require
[`scipy`](http://scipy.org/) and can automatically use
[`numba`](http://numba.pydata.org/).  `Scipy` is a standard python
package for scientific computation, and implements interfaces to C and
Fortran codes for optimization (among other things) need for finding
mean and optimal rotors.  `Numba` uses [LLVM](http://llvm.org/) to
compile python code to machine code, accelerating many numerical
functions by factors of anywhere from 2 to 2000.  It is *possible* to
run all the code without `numba`, but these particular functions can
be anywhere from 4 to 400 times slower without it.

Both `scipy` and `numba` can be installed with `pip` or `conda`.
However, because `conda` is specifically geared toward scientific
python, it is generally more robust for these more complicated
packages.  In fact, the main
[`anaconda`](https://www.anaconda.com/products/individual) package
comes with both `numba` and `scipy`.  If you prefer the smaller
download size of [`miniconda`](http://conda.pydata.org/miniconda.html)
(which comes with minimal extras), you'll also have to run this
command:

```sh
conda install numpy scipy numba
```


## Bug reports and feature requests

Bug reports and feature requests are entirely welcome (with [very few
exceptions](https://github.com/moble/quaternion/wiki/Euler-angles-are-horrible#opening-issues-and-pull-requests)).
The best way to do this is to open an [issue on this code's github
page](https://github.com/moble/quaternion/issues).  For bug reports,
please try to include a minimal working example demonstrating the
problem.

[Pull requests](https://help.github.com/articles/using-pull-requests/)
are also entirely welcome, of course, if you have an idea where the
code is going wrong, or have an idea for a new feature that you know
how to implement.

This code is routinely tested on recent versions of both python (3.8
though 3.11) and numpy (>=1.13).  But the test coverage is not
necessarily as complete as it could be, so bugs may certainly be
present, especially in the higher-level functions like
`mean_rotor_...`.


## Acknowledgments

This code is, of course, hosted on github.  Because it is an
open-source project, the hosting is free, and all the wonderful
features of github are available, including free wiki space and web
page hosting, pull requests, a nice interface to the git logs, etc.
Github user Hannes Ovrén (hovren) pointed out some errors in a
previous version of this code and suggested some nice utility
functions for rotation matrices, etc.  Github user Stijn van Drongelen
(rhymoid) contributed some code that makes compilation work with
MSVC++.  Github user Jon Long (longjon) has provided some elegant
contributions to substantially improve several tricky parts of this
code.  Rebecca Turner (9999years) and Leo Stein (duetosymmetry) did
all the work in getting the documentation onto [Read the
Docs](https://quaternion.readthedocs.io/).

Every change in this code is [automatically
tested](https://github.com/moble/quaternion/actions) on Github
Actions.  The code is downloaded and installed fresh each time, and
then tested, on each of the different supported versions of python, on
each of the supported platforms.  This ensures that no change I make
to the code breaks either installation or any of the features that I
have written tests for.  Github Actions also automatically builds the
`pip` versions of the code hosted on
[pypi](https://pypi.python.org/pypi/numpy-quaternion).  Conda-forge
also uses Github Actions to build [the conda/mamba
version](https://github.com/conda-forge/quaternion-feedstock) hosted
on [anaconda.org](https://anaconda.org/conda-forge/quaternion).  These
are all free services for open-source projects like this one.

The work of creating this code was supported in part by the Sherman
Fairchild Foundation and by NSF Grants No. PHY-1306125 and
AST-1333129.




<br/>

---

###### <sup>1</sup> Euler angles are awful

Euler angles are pretty much [the worst things
ever](https://moble.github.io/spherical_functions/#euler-angles) and it
makes me feel bad even supporting them.  Quaternions are faster, more
accurate, basically free of singularities, more intuitive, and
generally easier to understand.  You can work entirely without Euler
angles (I certainly do).  You absolutely never need them.  But if
you really can't give them up, they are mildly supported.

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/moble/quaternion",
    "name": "numpy-quaternion",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": null,
    "author": "Michael Boyle",
    "author_email": "Michael Boyle <michael.oliver.boyle@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/86/4c/99e11a59dca7a36056e8efffcc22a63f0a578d06a958d3ec82b5e864da6d/numpy_quaternion-2024.0.3.tar.gz",
    "platform": null,
    "description": "[![Test Status](https://github.com/moble/quaternion/workflows/tests/badge.svg)](https://github.com/moble/quaternion/actions)\n[![Documentation Status](https://readthedocs.org/projects/quaternion/badge/?version=latest)](https://quaternion.readthedocs.io/en/latest/?badge=latest)\n[![PyPI Version](https://img.shields.io/pypi/v/numpy-quaternion?color=)](https://pypi.org/project/numpy-quaternion/)\n[![Conda Version](https://img.shields.io/conda/vn/conda-forge/quaternion.svg?color=)](https://anaconda.org/conda-forge/quaternion)\n[![MIT License](https://img.shields.io/github/license/moble/quaternion.svg)](https://github.com/moble/quaternion/blob/main/LICENSE)\n[![DOI](https://zenodo.org/badge/27896013.svg)](https://zenodo.org/badge/latestdoi/27896013)\n\n\n# Quaternions in numpy\n\nThis Python module adds a quaternion dtype to NumPy.\n\nThe code was originally based on [code by Martin\nLing](https://github.com/martinling/numpy_quaternion) (which he wrote\nwith help from Mark Wiebe), but was rewritten with ideas from\n[rational](https://github.com/numpy/numpy-dtypes/tree/master/npytypes/rational)\nto work with newer python versions (and to fix a few bugs), and\n*greatly* expands the applications of quaternions.\n\nSee also the pure-python package\n[quaternionic](https://github.com/moble/quaternionic).\n\n## Quickstart\n\n```sh\nconda install -c conda-forge quaternion\n```\n\nor\n\n```sh\npython -m pip install --upgrade --force-reinstall numpy-quaternion\n```\n\nOptionally add `--user` after `install` in the second command if\nyou're not using a python environment \u2014 though you should start.\n\n\n## Installation\n\nAssuming you use `conda` to manage your python installation (which is\ncurrently the preferred choice for science and engineering with\npython), you can install this package simply as\n\n```sh\nconda install -c conda-forge quaternion\n```\n\nIf you prefer to use `pip`, you can instead do\n\n```sh\npython -m pip install --upgrade --force-reinstall numpy-quaternion\n```\n\n(See [here](https://snarky.ca/why-you-should-use-python-m-pip/) for a\nveteran python core contributor's explanation of why you should always\nuse `python -m pip` instead of just `pip` or `pip3`.)  The `--upgrade\n--force-reinstall` options are not always necessary, but will ensure\nthat pip will update numpy if it has to.\n\nIf you refuse to use `conda`, you might want to install inside your\nhome directory without root privileges.  (Conda does this by default\nanyway.)  This is done by adding `--user` to the above command:\n\n```sh\npython -m pip install --user --upgrade --force-reinstall numpy-quaternion\n```\n\nNote that pip will attempt to compile the code \u2014 which requires a\nworking `C` compiler.\n\nFinally, there's also the fully manual option of just downloading the\ncode, changing to the code directory, and running\n\n```sh\npython -m pip install --upgrade --force-reinstall .\n```\n\nThis should work regardless of the installation method, as long as you\nhave a compiler hanging around.\n\n\n## Basic usage\n\nThe full documentation can be found on [Read the\nDocs](https://quaternion.readthedocs.io/), and most functions have\ndocstrings that should explain the relevant points.  The following are\nmostly for the purposes of example.\n\n```python\n>>> import numpy as np\n>>> import quaternion\n>>> np.quaternion(1,0,0,0)\nquaternion(1, 0, 0, 0)\n>>> q1 = np.quaternion(1,2,3,4)\n>>> q2 = np.quaternion(5,6,7,8)\n>>> q1 * q2\nquaternion(-60, 12, 30, 24)\n>>> a = np.array([q1, q2])\n>>> a\narray([quaternion(1, 2, 3, 4), quaternion(5, 6, 7, 8)], dtype=quaternion)\n>>> np.exp(a)\narray([quaternion(1.69392, -0.78956, -1.18434, -1.57912),\n       quaternion(138.909, -25.6861, -29.9671, -34.2481)], dtype=quaternion)\n```\n\nNote that this package represents a quaternion as a scalar, followed\nby the `x` component of the vector part, followed by `y`, followed by\n`z`.  These components can be accessed directly:\n```python\n>>> q1.w, q1.x, q1.y, q1.z\n(1.0, 2.0, 3.0, 4.0)\n```\nHowever, this only works on an individual `quaternion`; for arrays it\nis better to use \"vectorized\" operations like `as_float_array`.\n\nThe following ufuncs are implemented (which means they run fast on\nnumpy arrays):\n```python\nadd, subtract, multiply, divide, log, exp, power, negative, conjugate,\ncopysign, equal, not_equal, less, less_equal, isnan, isinf, isfinite, absolute\n```\n\nQuaternion components are stored as double-precision floating point\nnumbers \u2014 `float`s, in python language, or `float64` in more precise\nnumpy language.  Numpy arrays with `dtype=quaternion` can be accessed\nas arrays of doubles without any (slow, memory-consuming) copying of\ndata; rather, a `view` of the exact same memory space can be created\nwithin a microsecond, regardless of the shape or size of the\nquaternion array.\n\nComparison operations follow the same lexicographic ordering as\ntuples.\n\nThe unary tests isnan and isinf return true if they would return true\nfor any individual component; isfinite returns true if it would return\ntrue for all components.\n\nReal types may be cast to quaternions, giving quaternions with zero\nfor all three imaginary components. Complex types may also be cast to\nquaternions, with their single imaginary component becoming the first\nimaginary component of the quaternion. Quaternions may not be cast to\nreal or complex types.\n\nSeveral array-conversion functions are also included.  For example, to\nconvert an Nx4 array of floats to an N-dimensional array of\nquaternions, use `as_quat_array`:\n```python\n>>> import numpy as np\n>>> import quaternion\n>>> a = np.random.rand(7, 4)\n>>> a\narray([[ 0.93138726,  0.46972279,  0.18706385,  0.86605021],\n       [ 0.70633523,  0.69982741,  0.93303559,  0.61440879],\n       [ 0.79334456,  0.65912598,  0.0711557 ,  0.46622885],\n       [ 0.88185987,  0.9391296 ,  0.73670503,  0.27115149],\n       [ 0.49176628,  0.56688076,  0.13216632,  0.33309146],\n       [ 0.11951624,  0.86804078,  0.77968826,  0.37229404],\n       [ 0.33187593,  0.53391165,  0.8577846 ,  0.18336855]])\n>>> qs = quaternion.as_quat_array(a)\n>>> qs\narray([ quaternion(0.931387262880247, 0.469722787598354, 0.187063852060487, 0.866050210100621),\n       quaternion(0.706335233363319, 0.69982740767353, 0.933035590130247, 0.614408786768725),\n       quaternion(0.793344561317281, 0.659125976566815, 0.0711557025000925, 0.466228847713644),\n       quaternion(0.881859869074069, 0.939129602918467, 0.736705031709562, 0.271151494174001),\n       quaternion(0.491766284854505, 0.566880763189927, 0.132166320200012, 0.333091463422536),\n       quaternion(0.119516238634238, 0.86804077992676, 0.779688263524229, 0.372294043850009),\n       quaternion(0.331875925159073, 0.533911652483908, 0.857784598617977, 0.183368547490701)], dtype=quaternion)\n```\n[Note that quaternions are printed with full precision, unlike floats,\nwhich is why you see extra digits above.  But the actual data is\nidentical in the two cases.]  To convert an N-dimensional array of\nquaternions to an Nx4 array of floats, use `as_float_array`:\n```python\n>>> b = quaternion.as_float_array(qs)\n>>> b\narray([[ 0.93138726,  0.46972279,  0.18706385,  0.86605021],\n       [ 0.70633523,  0.69982741,  0.93303559,  0.61440879],\n       [ 0.79334456,  0.65912598,  0.0711557 ,  0.46622885],\n       [ 0.88185987,  0.9391296 ,  0.73670503,  0.27115149],\n       [ 0.49176628,  0.56688076,  0.13216632,  0.33309146],\n       [ 0.11951624,  0.86804078,  0.77968826,  0.37229404],\n       [ 0.33187593,  0.53391165,  0.8577846 ,  0.18336855]])\n```\n\nIt is also possible to convert a quaternion to or from a 3x3 array of\nfloats representing a rotation matrix, or an array of N quaternions to\nor from an Nx3x3 array of floats representing N rotation matrices,\nusing `as_rotation_matrix` and `from_rotation_matrix`.  Similar\nconversions are possible for rotation vectors using\n`as_rotation_vector` and `from_rotation_vector`, and for spherical\ncoordinates using `as_spherical_coords` and `from_spherical_coords`.\nFinally, it is possible to derive the Euler angles from a quaternion\nusing `as_euler_angles`, or create a quaternion from Euler angles\nusing `from_euler_angles` \u2014\u00a0though be aware that Euler angles are\nbasically the worst things\never.<sup>[1](#1-euler-angles-are-awful)</sup> Before you complain\nabout those functions using something other than your favorite\nconventions, please read [this\npage](https://github.com/moble/quaternion/wiki/Euler-angles-are-horrible).\n\n\n## Dependencies\n\nWith the standard installation methods, hopefully you won't need to\nworry about dependencies directly.  But in case you do, here's what\nyou need to know.\n\nThe basic requirements for this code are reasonably current versions\nof `python` and `numpy`.  In particular, `python` versions 3.10\nthrough 3.12 are routinely tested.  Because of its crucial dependence\non `numpy`, this package can only support versions of `python` that\nare directly supported by `numpy` \u2014 which limits support to releases\nfrom the past few years.  Old versions of `python` will work with\n*older* versions of this package, which are still available from PyPI\nand conda-forge.  Some older versions of `python` may still work with\nnewer versions of this package, but your mileage may vary.\n\nHowever, certain advanced functions in this package (including\n`squad`, `mean_rotor_in_intrinsic_metric`,\n`integrate_angular_velocity`, and related functions) require\n[`scipy`](http://scipy.org/) and can automatically use\n[`numba`](http://numba.pydata.org/).  `Scipy` is a standard python\npackage for scientific computation, and implements interfaces to C and\nFortran codes for optimization (among other things) need for finding\nmean and optimal rotors.  `Numba` uses [LLVM](http://llvm.org/) to\ncompile python code to machine code, accelerating many numerical\nfunctions by factors of anywhere from 2 to 2000.  It is *possible* to\nrun all the code without `numba`, but these particular functions can\nbe anywhere from 4 to 400 times slower without it.\n\nBoth `scipy` and `numba` can be installed with `pip` or `conda`.\nHowever, because `conda` is specifically geared toward scientific\npython, it is generally more robust for these more complicated\npackages.  In fact, the main\n[`anaconda`](https://www.anaconda.com/products/individual) package\ncomes with both `numba` and `scipy`.  If you prefer the smaller\ndownload size of [`miniconda`](http://conda.pydata.org/miniconda.html)\n(which comes with minimal extras), you'll also have to run this\ncommand:\n\n```sh\nconda install numpy scipy numba\n```\n\n\n## Bug reports and feature requests\n\nBug reports and feature requests are entirely welcome (with [very few\nexceptions](https://github.com/moble/quaternion/wiki/Euler-angles-are-horrible#opening-issues-and-pull-requests)).\nThe best way to do this is to open an [issue on this code's github\npage](https://github.com/moble/quaternion/issues).  For bug reports,\nplease try to include a minimal working example demonstrating the\nproblem.\n\n[Pull requests](https://help.github.com/articles/using-pull-requests/)\nare also entirely welcome, of course, if you have an idea where the\ncode is going wrong, or have an idea for a new feature that you know\nhow to implement.\n\nThis code is routinely tested on recent versions of both python (3.8\nthough 3.11) and numpy (>=1.13).  But the test coverage is not\nnecessarily as complete as it could be, so bugs may certainly be\npresent, especially in the higher-level functions like\n`mean_rotor_...`.\n\n\n## Acknowledgments\n\nThis code is, of course, hosted on github.  Because it is an\nopen-source project, the hosting is free, and all the wonderful\nfeatures of github are available, including free wiki space and web\npage hosting, pull requests, a nice interface to the git logs, etc.\nGithub user Hannes Ovr\u00e9n (hovren) pointed out some errors in a\nprevious version of this code and suggested some nice utility\nfunctions for rotation matrices, etc.  Github user Stijn van Drongelen\n(rhymoid) contributed some code that makes compilation work with\nMSVC++.  Github user Jon Long (longjon) has provided some elegant\ncontributions to substantially improve several tricky parts of this\ncode.  Rebecca Turner (9999years) and Leo Stein (duetosymmetry) did\nall the work in getting the documentation onto [Read the\nDocs](https://quaternion.readthedocs.io/).\n\nEvery change in this code is [automatically\ntested](https://github.com/moble/quaternion/actions) on Github\nActions.  The code is downloaded and installed fresh each time, and\nthen tested, on each of the different supported versions of python, on\neach of the supported platforms.  This ensures that no change I make\nto the code breaks either installation or any of the features that I\nhave written tests for.  Github Actions also automatically builds the\n`pip` versions of the code hosted on\n[pypi](https://pypi.python.org/pypi/numpy-quaternion).  Conda-forge\nalso uses Github Actions to build [the conda/mamba\nversion](https://github.com/conda-forge/quaternion-feedstock) hosted\non [anaconda.org](https://anaconda.org/conda-forge/quaternion).  These\nare all free services for open-source projects like this one.\n\nThe work of creating this code was supported in part by the Sherman\nFairchild Foundation and by NSF Grants No. PHY-1306125 and\nAST-1333129.\n\n\n\n\n<br/>\n\n---\n\n###### <sup>1</sup> Euler angles are awful\n\nEuler angles are pretty much [the worst things\never](https://moble.github.io/spherical_functions/#euler-angles) and it\nmakes me feel bad even supporting them.  Quaternions are faster, more\naccurate, basically free of singularities, more intuitive, and\ngenerally easier to understand.  You can work entirely without Euler\nangles (I certainly do).  You absolutely never need them.  But if\nyou really can't give them up, they are mildly supported.\n",
    "bugtrack_url": null,
    "license": "The MIT License (MIT)\n        \n        Copyright (c) 2024 Michael Boyle\n        \n        Permission is hereby granted, free of charge, to any person obtaining a copy\n        of this software and associated documentation files (the \"Software\"), to deal\n        in the Software without restriction, including without limitation the rights\n        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n        copies of the Software, and to permit persons to whom the Software is\n        furnished to do so, subject to the following conditions:\n        \n        The above copyright notice and this permission notice shall be included in all\n        copies or substantial portions of the Software.\n        \n        THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n        SOFTWARE.\n        ",
    "summary": "Add a quaternion dtype to NumPy",
    "version": "2024.0.3",
    "project_urls": {
        "Documentation": "https://quaternion.readthedocs.io/en/latest",
        "Homepage": "https://github.com/moble/quaternion"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a982bff4a7c2068eea6822ab52f7713d501cd4d48a2646fde27e84933677db4f",
                "md5": "9f92c85439a6d9a70145c3e193455b03",
                "sha256": "5a050861be60f09d9587423de6ae7a43d74ab20e25a83c7bb95dc85bc803744d"
            },
            "downloads": -1,
            "filename": "numpy_quaternion-2024.0.3-cp310-cp310-macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "9f92c85439a6d9a70145c3e193455b03",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.10",
            "size": 87168,
            "upload_time": "2024-10-29T20:15:45",
            "upload_time_iso_8601": "2024-10-29T20:15:45.338088Z",
            "url": "https://files.pythonhosted.org/packages/a9/82/bff4a7c2068eea6822ab52f7713d501cd4d48a2646fde27e84933677db4f/numpy_quaternion-2024.0.3-cp310-cp310-macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "6771ac58604e89a36d245a44b160535d207e3d36935566b9c6046b33505c54a6",
                "md5": "ededa6a11171bed1eb33b4d12a5eae0e",
                "sha256": "6843c718fc99f89ba5cbc177fde731a03f8769561a9e4390f748cb86bd84a00d"
            },
            "downloads": -1,
            "filename": "numpy_quaternion-2024.0.3-cp310-cp310-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "ededa6a11171bed1eb33b4d12a5eae0e",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.10",
            "size": 62233,
            "upload_time": "2024-10-29T20:15:54",
            "upload_time_iso_8601": "2024-10-29T20:15:54.228225Z",
            "url": "https://files.pythonhosted.org/packages/67/71/ac58604e89a36d245a44b160535d207e3d36935566b9c6046b33505c54a6/numpy_quaternion-2024.0.3-cp310-cp310-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "6e3b885c17cf386d25860557a9d296a3b6393e82dbe4401b80fe649b53198641",
                "md5": "500bc93929f3793e1bdcd0327c9e9b66",
                "sha256": "2969d5ddad2bc33ecce551fae054efa75f3e7daa63c7a157fb6c30a8be01f215"
            },
            "downloads": -1,
            "filename": "numpy_quaternion-2024.0.3-cp310-cp310-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "500bc93929f3793e1bdcd0327c9e9b66",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.10",
            "size": 56061,
            "upload_time": "2024-10-29T20:15:56",
            "upload_time_iso_8601": "2024-10-29T20:15:56.224752Z",
            "url": "https://files.pythonhosted.org/packages/6e/3b/885c17cf386d25860557a9d296a3b6393e82dbe4401b80fe649b53198641/numpy_quaternion-2024.0.3-cp310-cp310-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "4a165c07446f9b2012a6fb8b2359b32cad49ac3f3e384ce37d8543c1b041c192",
                "md5": "b9d3d56b93fdd1b7215f9b8c3520e37a",
                "sha256": "078efa14e302fc5b4a091ae8de2566002fb4af1f0509263a4c6d060c99f51415"
            },
            "downloads": -1,
            "filename": "numpy_quaternion-2024.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "b9d3d56b93fdd1b7215f9b8c3520e37a",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.10",
            "size": 181974,
            "upload_time": "2024-10-29T20:15:47",
            "upload_time_iso_8601": "2024-10-29T20:15:47.169133Z",
            "url": "https://files.pythonhosted.org/packages/4a/16/5c07446f9b2012a6fb8b2359b32cad49ac3f3e384ce37d8543c1b041c192/numpy_quaternion-2024.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a2567bf6619eafac834c252a05cdf502421dc31131c09d894b1d5d8709044bf3",
                "md5": "c291ea4bf5da699d391bcdd7c0b20320",
                "sha256": "ce23a7555ec8ab1eab6d28487068038565799d4fa61e9bfdab04d919b49ddc74"
            },
            "downloads": -1,
            "filename": "numpy_quaternion-2024.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c291ea4bf5da699d391bcdd7c0b20320",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.10",
            "size": 198612,
            "upload_time": "2024-10-29T20:16:03",
            "upload_time_iso_8601": "2024-10-29T20:16:03.880874Z",
            "url": "https://files.pythonhosted.org/packages/a2/56/7bf6619eafac834c252a05cdf502421dc31131c09d894b1d5d8709044bf3/numpy_quaternion-2024.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "aa1f8a9f620c6cfbbca6bcf4a24fd345d041a2f97b0b112c47b3069131f64c13",
                "md5": "2140d4ba88777651781e9ef060dcbe58",
                "sha256": "85c7713f881807a94a7b14a551e7decb1ac0ad31437a9e2983fd00f35f557965"
            },
            "downloads": -1,
            "filename": "numpy_quaternion-2024.0.3-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "2140d4ba88777651781e9ef060dcbe58",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.10",
            "size": 71357,
            "upload_time": "2024-10-29T20:15:58",
            "upload_time_iso_8601": "2024-10-29T20:15:58.825615Z",
            "url": "https://files.pythonhosted.org/packages/aa/1f/8a9f620c6cfbbca6bcf4a24fd345d041a2f97b0b112c47b3069131f64c13/numpy_quaternion-2024.0.3-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "0525e1bc1ce1e6dcc01c51bc6288611fa52a4a093af7cc94af7615d24d2b1d59",
                "md5": "2ec0afa5e8bcef8a4c8fe8f740fc81d7",
                "sha256": "beda722c8f0fe629c265ff7b1dd74f888a301bab2cab8aa8b25f4124779d7588"
            },
            "downloads": -1,
            "filename": "numpy_quaternion-2024.0.3-cp311-cp311-macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "2ec0afa5e8bcef8a4c8fe8f740fc81d7",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.10",
            "size": 87170,
            "upload_time": "2024-10-29T20:15:48",
            "upload_time_iso_8601": "2024-10-29T20:15:48.792695Z",
            "url": "https://files.pythonhosted.org/packages/05/25/e1bc1ce1e6dcc01c51bc6288611fa52a4a093af7cc94af7615d24d2b1d59/numpy_quaternion-2024.0.3-cp311-cp311-macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "89d689ebd6764b0d4efd38c34b9f7b388ccb1cd5870872d5b827d3a5b60a6b65",
                "md5": "31146a80a13e7e423ccbe6399ff2fd47",
                "sha256": "1d2c56009d6a42c0d466e7c297d1c3afcd620e1a39ecfa267d506b3e88ffc91c"
            },
            "downloads": -1,
            "filename": "numpy_quaternion-2024.0.3-cp311-cp311-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "31146a80a13e7e423ccbe6399ff2fd47",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.10",
            "size": 62233,
            "upload_time": "2024-10-29T20:16:09",
            "upload_time_iso_8601": "2024-10-29T20:16:09.863970Z",
            "url": "https://files.pythonhosted.org/packages/89/d6/89ebd6764b0d4efd38c34b9f7b388ccb1cd5870872d5b827d3a5b60a6b65/numpy_quaternion-2024.0.3-cp311-cp311-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "daa78ab0d8c6baa27092c90f3170e6d5d596a85ead8e81c834e7c48ce6bd1d01",
                "md5": "785a9966be09eeb896e7e76d14aef81e",
                "sha256": "76a96dca06981e05586350b5771d7588239217c5e984c989a8b3737f6d25861f"
            },
            "downloads": -1,
            "filename": "numpy_quaternion-2024.0.3-cp311-cp311-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "785a9966be09eeb896e7e76d14aef81e",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.10",
            "size": 56066,
            "upload_time": "2024-10-29T20:15:51",
            "upload_time_iso_8601": "2024-10-29T20:15:51.600951Z",
            "url": "https://files.pythonhosted.org/packages/da/a7/8ab0d8c6baa27092c90f3170e6d5d596a85ead8e81c834e7c48ce6bd1d01/numpy_quaternion-2024.0.3-cp311-cp311-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "527d081fbc31a903b0955183d3e02c6055b6ffa39198007956be21551d585f37",
                "md5": "476a98c02c2df6fcfbcc1d5dac2e073a",
                "sha256": "0c8d7c2349a1e864955cbed29d12a74fba11c674ed35feb409c267068ffb1581"
            },
            "downloads": -1,
            "filename": "numpy_quaternion-2024.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "476a98c02c2df6fcfbcc1d5dac2e073a",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.10",
            "size": 183038,
            "upload_time": "2024-10-29T20:16:05",
            "upload_time_iso_8601": "2024-10-29T20:16:05.860985Z",
            "url": "https://files.pythonhosted.org/packages/52/7d/081fbc31a903b0955183d3e02c6055b6ffa39198007956be21551d585f37/numpy_quaternion-2024.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "7a9c5a801c2b94ae733f84ae8bcff2d4511935974658e78bb2090df611165cb4",
                "md5": "bf5f5123ea6fd8839f678938b2f1311f",
                "sha256": "8be77f4bb9f33529d12b87ab18dae9476cbba2f2178979c8be3e969f14823742"
            },
            "downloads": -1,
            "filename": "numpy_quaternion-2024.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "bf5f5123ea6fd8839f678938b2f1311f",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.10",
            "size": 199818,
            "upload_time": "2024-10-29T20:15:53",
            "upload_time_iso_8601": "2024-10-29T20:15:53.130229Z",
            "url": "https://files.pythonhosted.org/packages/7a/9c/5a801c2b94ae733f84ae8bcff2d4511935974658e78bb2090df611165cb4/numpy_quaternion-2024.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "1a648fee6c250f909cd0fe7e9beac7b1550e0c5df1eb81fc990a69ccfec66959",
                "md5": "3a40187ff05f8e25adba87a52a79655d",
                "sha256": "f476bd8b7c5a802d5aa17d7e68f134cc258dffb78518f457a9df4c5d58bd32e2"
            },
            "downloads": -1,
            "filename": "numpy_quaternion-2024.0.3-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "3a40187ff05f8e25adba87a52a79655d",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.10",
            "size": 71361,
            "upload_time": "2024-10-29T20:16:02",
            "upload_time_iso_8601": "2024-10-29T20:16:02.371160Z",
            "url": "https://files.pythonhosted.org/packages/1a/64/8fee6c250f909cd0fe7e9beac7b1550e0c5df1eb81fc990a69ccfec66959/numpy_quaternion-2024.0.3-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "02632a71727726d70f0decb5889d48bcaa24754745afad6a3b73610a129e47c0",
                "md5": "066a3d2f3ab3554cd6e5c68b4fce614e",
                "sha256": "214d1792456f3b5738355f09defa90d7130764e8d4abb4a7a5d0b7b3d59300fb"
            },
            "downloads": -1,
            "filename": "numpy_quaternion-2024.0.3-cp312-cp312-macosx_10_13_universal2.whl",
            "has_sig": false,
            "md5_digest": "066a3d2f3ab3554cd6e5c68b4fce614e",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.10",
            "size": 87467,
            "upload_time": "2024-10-29T20:15:57",
            "upload_time_iso_8601": "2024-10-29T20:15:57.286452Z",
            "url": "https://files.pythonhosted.org/packages/02/63/2a71727726d70f0decb5889d48bcaa24754745afad6a3b73610a129e47c0/numpy_quaternion-2024.0.3-cp312-cp312-macosx_10_13_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "deb835291839efff99514a5d7bea131b3ab3b395cd2dc77360eb7d36dc4e5b4c",
                "md5": "36aee10f02362d83dbc42a2a0a4be275",
                "sha256": "f366953f33e4d86c2ec6d9024a8ac2bc924c29c8f1d5f1bc4329d408f9994fd5"
            },
            "downloads": -1,
            "filename": "numpy_quaternion-2024.0.3-cp312-cp312-macosx_10_13_x86_64.whl",
            "has_sig": false,
            "md5_digest": "36aee10f02362d83dbc42a2a0a4be275",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.10",
            "size": 62287,
            "upload_time": "2024-10-29T20:15:50",
            "upload_time_iso_8601": "2024-10-29T20:15:50.167527Z",
            "url": "https://files.pythonhosted.org/packages/de/b8/35291839efff99514a5d7bea131b3ab3b395cd2dc77360eb7d36dc4e5b4c/numpy_quaternion-2024.0.3-cp312-cp312-macosx_10_13_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b6ba8284134240cfd37476eaddde6f58a21680e1ec98dd1636318c8e0ef09875",
                "md5": "12c1d7cd49bf911879bbe5cd4b772dbf",
                "sha256": "bfd64b08027d60a9861db80321fa474f9c20b5b181e61bfb9c60b40132b26257"
            },
            "downloads": -1,
            "filename": "numpy_quaternion-2024.0.3-cp312-cp312-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "12c1d7cd49bf911879bbe5cd4b772dbf",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.10",
            "size": 56267,
            "upload_time": "2024-10-29T20:16:07",
            "upload_time_iso_8601": "2024-10-29T20:16:07.283294Z",
            "url": "https://files.pythonhosted.org/packages/b6/ba/8284134240cfd37476eaddde6f58a21680e1ec98dd1636318c8e0ef09875/numpy_quaternion-2024.0.3-cp312-cp312-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "99f8a61306b128edd719236edd652016a50f1402982eff31e3d3cace26067504",
                "md5": "9f6691d4dbba2b49bc561ad5904205b2",
                "sha256": "902afbd64560510be5ef563ba253374e2c51bce37245b4702f0017d019d82ba2"
            },
            "downloads": -1,
            "filename": "numpy_quaternion-2024.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "has_sig": false,
            "md5_digest": "9f6691d4dbba2b49bc561ad5904205b2",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.10",
            "size": 184744,
            "upload_time": "2024-10-29T20:16:01",
            "upload_time_iso_8601": "2024-10-29T20:16:01.199553Z",
            "url": "https://files.pythonhosted.org/packages/99/f8/a61306b128edd719236edd652016a50f1402982eff31e3d3cace26067504/numpy_quaternion-2024.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b37dfb2e06cefad7260179021fde9103e9c5bbeca87cd92a72d45cb02c4eb300",
                "md5": "c6108c2f1fb085914221d68eb380300c",
                "sha256": "12f39e147c610553ad41815a6cbc5705e29a91f27c2d4ab587e54e3a0e4d5cb7"
            },
            "downloads": -1,
            "filename": "numpy_quaternion-2024.0.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "has_sig": false,
            "md5_digest": "c6108c2f1fb085914221d68eb380300c",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.10",
            "size": 201627,
            "upload_time": "2024-10-29T20:16:08",
            "upload_time_iso_8601": "2024-10-29T20:16:08.774089Z",
            "url": "https://files.pythonhosted.org/packages/b3/7d/fb2e06cefad7260179021fde9103e9c5bbeca87cd92a72d45cb02c4eb300/numpy_quaternion-2024.0.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e6bd51d63ad0e0b28222dbfc00e66b22590e5512eabbec23386058218a5668ed",
                "md5": "24611f4dac68a3b1976a9a76685e1543",
                "sha256": "597b13206ed662170790dab3b9307241dabaa77562969490672f22215e0dae52"
            },
            "downloads": -1,
            "filename": "numpy_quaternion-2024.0.3-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "24611f4dac68a3b1976a9a76685e1543",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.10",
            "size": 71433,
            "upload_time": "2024-10-29T20:15:55",
            "upload_time_iso_8601": "2024-10-29T20:15:55.274644Z",
            "url": "https://files.pythonhosted.org/packages/e6/bd/51d63ad0e0b28222dbfc00e66b22590e5512eabbec23386058218a5668ed/numpy_quaternion-2024.0.3-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "864c99e11a59dca7a36056e8efffcc22a63f0a578d06a958d3ec82b5e864da6d",
                "md5": "7468f0bb740df561a2cac214a0663ffb",
                "sha256": "cf39a8a4506eeda297ca07a508c10c08b3487df851a0e34f070a7bf8fab9f290"
            },
            "downloads": -1,
            "filename": "numpy_quaternion-2024.0.3.tar.gz",
            "has_sig": false,
            "md5_digest": "7468f0bb740df561a2cac214a0663ffb",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 66997,
            "upload_time": "2024-10-29T20:16:00",
            "upload_time_iso_8601": "2024-10-29T20:16:00.294143Z",
            "url": "https://files.pythonhosted.org/packages/86/4c/99e11a59dca7a36056e8efffcc22a63f0a578d06a958d3ec82b5e864da6d/numpy_quaternion-2024.0.3.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-10-29 20:16:00",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "moble",
    "github_project": "quaternion",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "numpy-quaternion"
}
        
Elapsed time: 0.39677s