Main Content

ulab: Crunch Numbers fast in CircuitPython

What is ulab
ulab (pronounced “micro lab”) lets you perform number crunching tasks in CircuitPython more quickly, often around 10x as fast. This can be very handy when dealing with sensor data, as we’ll see below.

Right now, you need to get the “absolute newest” version of CircuitPython to have ulab enabled. It’ll be in the stable version no sooner than when 5.1.0 is released.

ulab is modeled after numpy, but is not entirely compatible; so after the examples, we’ll also provide you with some guidelines to help you move between numpy and ulab.

ulab is not available in Blinka, Adafruit’s Single Board Computer layer for CircuitPython - for those boards we recommend using plain numpy since its available! If your code needs to run on both CircuitPython and Blinka, you’ll probably either need to use conditional code or forego the use of ulab altogether.

The ulab API
ulab makes things faster by operating on entire arrays of values in one operation. For example, when you have two numbers a and b, a+b adds them together, returning a new number. When you have two ulab arrays a and b, a+b adds the corresponding numbers in a to the corresponding numbers in b, returning a new array. Want to double every number in an array? That’s a*2. Compute its sine? ulab.vector.sin(a). It also has special versions of functions like sum that act on a whole array and return a single number. Documentation for all functions in ulab are on readthedocs.

These examples only cover a portion of the functions available in ulab. Major items we will not cover include:

Matrix functions in ulab.linalg, such as determinant, inverse, and eigenvectors of a matrix
Creating vectors with ulab.linspace, which is sort of like range() but for arrays
Statistical functions such as standard deviation in ulab.numerical
Functions for working with polynomials in ulab.polynomial
Slicing arrays with arr[lo:hi:step]”

Link to article