# Numpy

## Why do I need it?

numpy is “The fundamental package for scientific computing with Python”. In particular it gives us fast and efficient array types which can be used with C/C++ types as well.

An array is a central data structure of the NumPy library. An array is a grid of values and it contains information about the raw data, how to locate an element, and how to interpret an element. It has a grid of elements that can be indexed in various ways. The elements are all of the same type, referred to as the array dtype.

One way we can initialize NumPy arrays is from Python lists, using nested lists for two- or higher-dimensional data.

## install

```
pip install numpy
```

`import`

```
import numpy as np
```

## Why would I use it?

Numpy is the core math / array / matrix library for python. It is the foundation of many other API’s and machine learning tools. It is one of the most used python libraries.

It’s really useful for things like PyOpenGL as we can use np.arrays to hold vertex attribute data.

Most Machine Learning and AI tools use numpy.

## Show me more!

A simple array example

```
#!/usr/bin/env python
import numpy as np
x = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
print(x)
print('shape is ',x.shape)
# we can index arrays
x[1][2]=99
print(x)
```

We can use them to represent a matrix and do affine transforms.

```
#!/usr/bin/env python
import numpy as np
from math import (cos,sin,radians)
from random import uniform
# create identity matrix then set as 45 rotation in X axis
tx = np.identity(4,dtype=float)
sr=sin(radians(45.0))
cr=cos(radians(45.0))
tx[1][1]=cr
tx[1][2]=sr
tx[2][1]=-sr
tx[2][2]=cr
print(tx)
print('shape is ',tx.shape)
# create array of random points (Vec43)
points=[np.array([uniform(-1,1),uniform(-1,1),uniform(-1,1),1.0]) for i in range(0,10)]
# show the use of either dot(x,y) or the @ operator to multiply the two
for p in points :
print('{} * tx ={}'.format(p,np.dot(p,tx)))
print('{} @ tx ={}'.format(p,p@tx))
```

Need an array of floats?

```
import numpy
np.arange(0.0,1.0,0.01)
array([0. , 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1 ,
0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.2 , 0.21,
0.22, 0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.3 , 0.31, 0.32,
0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.4 , 0.41, 0.42, 0.43,
0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.5 , 0.51, 0.52, 0.53, 0.54,
0.55, 0.56, 0.57, 0.58, 0.59, 0.6 , 0.61, 0.62, 0.63, 0.64, 0.65,
0.66, 0.67, 0.68, 0.69, 0.7 , 0.71, 0.72, 0.73, 0.74, 0.75, 0.76,
0.77, 0.78, 0.79, 0.8 , 0.81, 0.82, 0.83, 0.84, 0.85, 0.86, 0.87,
0.88, 0.89, 0.9 , 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98,
0.99])
```

## Now what?

The https://numpy.org/ website has loads of examples and documentation.

For a deep dive this book covers everything http://web.mit.edu/dvp/Public/numpybook.pdf

For a lighter touch see here https://numpy.org/doc/stable/user/basics.html and here https://www.edureka.co/blog/python-numpy-tutorial/