This package has been completely redesigned and released as vector
, use pip install vector
to obtain. The array-at-a-time computations from HEPVector are present, along with Numba support, Awkward support, and much more!
Numpy based vectors for general purpose calculation and physics. Designed for the SciKit-HEP project, but can be used stand-alone with no dependencies except Numpy (extra performance can be obtained if Numba is present).
The key design feature is array support. While non-array is also possible (backward compatible), arrays are many times faster and utilize all of Numpy's speed. An example of an array:
v = Vector3D(1, [2,3], 4)
would make two vectors, [1,2,4] and [1,3,4] (standard Numpy casting rules). In fact, the vector classes are simply subclasses of NDArrays, so anything that works with arrays works with Vectors, and Vectors can be cast to/from Numpy without a copy.
- Optional speedups with Numba for a few parts (more eventually)
- Phase space generator, similar speed (within a factor of 2 or so) to compiled ROOT, but fully in Python! Even works on an iPad. Also makes a good example of what HEPvector code looks like.
- Lorentz, 3D, and 2D vectors, and all common operations in a single vector base class. More metrics and dimensions can be added by users.
- Free software: BSD license
- Documentation: https://hepvector.readthedocs.io
To take advantage of the underlying numpy machinery, you should use arrays of vectors when possible. For example, if you use the included generation of phase space:
- 1 at a time: 5.18 ± 0.06 ms each
- 1,000,000 at a time: 0.80 ± 0.04 µs each (803 ms total)
You can see it is 6,000 times faster if you generate 1,000,000 events using arrays instead of placing event-per-event code in loops.
The most important thing to remember is that this is just a lightly modified subclass of np.ndarray
(just like np.array
and np.matrix
).
The first dimension is the vector components; all Vector3D
shapes will start with 3, for example. If you index, start your index with a :
to
capture all dimensions; if you don't, you'll get a normal np.array
out. You can use .view
to convert back and forth (no memory is copied).
You can create a vector several ways:
v = LorentzVector(x,y,z,t) # can be values or arrays
v = arr.view(LorentzVector) # Convert an existing array
v = LorentzVector.from_vector(arr) # Can also copy
v = LorentzVector.from_pandas(df) # DataFrames, too
v = Vector3D.from_spherical_coords(r, theta, phi)
v = Vector3D.from_cylindrical_coords(rho, phi, z)
You can use a variety of methods:
dot_product = a.dot(b)
cross_product = a.cross(b)
boost_vec = a.boost()
and others, see the docs. HEPvector is just a simple wrapper on top of a numpy array, where the
first dimension represents the components of the vector.
Any operation that does not apply to vectors (such as the transpose .T
) uses the underlying numpy
functionality and may return a numpy array instead of a Vector.
HEPvector was created by Henry Schreiner.
This package was created with Cookiecutter and the audreyr/cookiecutter-pypackage project template.