## Importing ulab

The ulab module is split into two main parts `ulab.numpy`

and `ulab.scipy`

each of which provide similar functionality to their respective CPython library counterpart. You can rename `ulab.numpy`

when you import it to use the shorthand name np. `from ulab import numpy as np`

then in your code you can call the functions like `np.sum()`

etc. Many existing CPython numpy examples are written to use this shorthand name.

## Working with CircuitPython and Blinka

Where possible, if a ulab function and a numpy function have the same name, ulab's functionality is a subset of numpy.

try: import ulab.numpy as np except ImportError: import numpy as np u = np.array([1,2,3,4]) v = np.array([1,-2,1]) print(np.convolve(u, v))

## Numpy/ulab differences

Many ulab functions do not support all the same arguments as numpy. For instance, `numpy.convolve`

supports several ways of controlling how the boundary conditions are handled, using the `mode=`

named parameter. However, `ulab.numpy.convolve`

always acts like numpy's `mode='full'`

.

In a few cases, numpy accepts a positional argument but ulab requires a named parameter. This is true of `ulab.numpy.linspace`

's `num=`

argument, for instance.

ulab does not support complex numbers. Because of this, ulab's fft returns a pair of arrays, where the first array holds the real part of the fft and the second array holds the imaginary part. Instead of using fft directly, consider whether to use `ulab.scipy.signal.spectrogram`

** **instead. For compatibility with both CircuitPython and Blinka, spectrum can be implemented as follows:

try: from ulab import numpy as np except ImportError: import numpy as np try: from ulab.scipy.signal import spectrogram except ImportError: def spectrogram(arr): return abs(np.fft.fft(arr)) data = np.array([1,2,1,4]) print(spectrogram(data))