# Advanced NumPy

## Introduction

## Learning Objectives

- Learner will know how to import
`numpy`

- Learner will be able to create one- and more dimensional arrays with zeros/ones, given elements or random elements.
- Learner will be able to apply a function to all elements of an array.

NumPy array is a data container. It is similar to Python lists, but it’s specialised for working on numerical data. NumPy is at the center of scientific Python ecosystem and it is a work-horse of many scientific libraries including scikit-learn, scikit-image, matplotlib, SciPy.

To use NumPy we need to start python interpreter and import `numpy`

package – it’s customary the use the following import statement, which will make all NumPy functions available under the `np`

prefix:

`import numpy as np`

If `numpy`

was installed correctly, this should not produce any messages. Let’s create a simple three-element NumPy array:

```
>>> x = np.array([2, 1, 5])
>>> x
array([2, 1, 5])
```

One of the advantages of NumPy is that it allows to apply functions (called `ufunc`

s) to all elements of an array without the need of for loops:

```
>>> np.sin(x)
array([ 0.90929743, 0.84147098, -0.95892427])
```

This is not only convenient but also more efficient than iterating through the elements using for loops. Similarly, we can add scalars to all elements or multiply them by a constant:

```
>>> x + 1
array([3, 2, 6])
```

To construct an array with pre-defined elements we can also use one of the built-in helper functions. `np.arange`

works like Python built-in `range`

, but it returns an array; `np.ones`

and `np.zeros`

returns arrays of 0s or 1s; `np.random.rand`

creates an array of random number from an interval [0, 1]:

```
>>> np.arange(5)
array([0, 1, 2, 3, 4])
>>> np.ones(5)
array([ 1., 1., 1., 1., 1.])
>>> np.zeros(5)
array([ 0., 0., 0., 0., 0.])
>>> np.random.rand(5)
array([ 0.27386612, 0.42769767, 0.38762774, 0.63308478, 0.46215844])
```

We can also construct a two- or more dimensional arrays:

```
>>> x = np.array([[1, 2], [5, 6]])
>>> x
array([[1, 2],
[5, 6]])
>>> np.ones((2, 2))
array([[ 1., 1.],
[ 1., 1.]])
```

Alternatively, a n-dimensional array can be obtained by reshaping a 1-D array:

```
>>> a = np.arange(9)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8])
>>> a.reshape(3,3)
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
```

Note that in this case we used a method of the array itself called `reshape`

rather than a function from NumPy module (`np.reshape`

). Both ways are possible and it’s usually only a matter of convenience which one we choose in a particular case.

## Creating a square array

Create a 5x5 square array with number 5 on diagonal and zeros otherwise. Consider using `np.eye`

function (you can check the docstring).