Transform

The hist package is still under active development, the usage and contents are in flux.

Based on boost-histogram’s Transform, hist provides a powerful transform system on Regular axes that allows you to provide a functional form for the conversion between a regular spacing and the actual bin edges. The following transforms are built in:

  • hist.axis.transform.sqrt: A square root transform;

  • hist.axis.transform.log: A logarithmic transform;

  • hist.axis.transform.Pow(power): Raise to a specified power;

  • hist.axis.transform.Function: Specify arbitrary conversion functions.

Transform Types

Here we show some basic usage of transforms in histogramming with pure Python. For more customized usage, you can refer the part in that of boost-histogram.

[1]:
import hist
from hist import Hist
import ctypes
import math
import numpy as np
[2]:
axis0 = hist.axis.Regular(10, 1, 4, name="A", transform=hist.axis.transform.sqrt)
axis1 = hist.axis.Regular(10, 1, 4, name="B", transform=hist.axis.transform.log)
axis2 = hist.axis.Regular(10, 1, 4, name="C", transform=hist.axis.transform.Pow(2))

ftype = ctypes.CFUNCTYPE(ctypes.c_double, ctypes.c_double)
axis3 = hist.axis.Regular(
    10,
    1,
    4,
    name="D",
    transform=hist.axis.transform.Function(ftype(math.log), ftype(math.exp)),
)
axis4 = hist.axis.Regular(
    10,
    1,
    4,
    name="E",
    transform=hist.axis.transform.Function(ftype(np.log), ftype(np.exp)),
)
[3]:
h = Hist(axis0, axis1, axis2, axis3, axis4)

Histogram’s Transforms

Hist also provides transform shortcuts for histograms. hist’s keeps the features of boost-histogram, and you can pass transform as a keyword argument when creating an axis. hist also allows you to use the .new shortcut directly when creating a Histogram for common transforms:

[4]:
h0 = Hist.new.Sqrt(10, 1, 4).Sqrt(10, 4, 9).Double()
h1 = Hist.new.Log(10, 1, 4).Log(10, 4, 9).Double()
h2 = Hist.new.Pow(10, 1, 4, power=3).Pow(10, 1, 4, power=5).Double()

h3 = (
    Hist.new.Func(10, 1, 4, forward=ftype(math.log), inverse=ftype(math.exp))
    .Func(10, 1, 4, forward=ftype(np.log), inverse=ftype(np.exp))
    .Double()
)