intro-to-data-science/01_scientific_stack/00_content_numpy.ipynb
Alexander Hess 51a5dcc8ee
Run black on all the notebooks
- we use black's default settings
- some cells are NOT kept in black's format to:
  - increase readability
  - or show Python's flexibility with regard to style
2024-07-15 12:12:51 +02:00

1366 lines
132 KiB
Text

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Note**: Click on \"*Kernel*\" > \"*Restart Kernel and Clear All Outputs*\" in [JupyterLab](https://jupyterlab.readthedocs.io/en/stable/) *before* reading this notebook to reset its output. If you cannot run this file on your machine, you may want to open it [in the cloud <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_mb.png\">](https://mybinder.org/v2/gh/webartifex/intro-to-data-science/main?urlpath=lab/tree/01_scientific_stack/00_content_numpy.ipynb)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Chapter 1: Python's Scientific Stack (Part 1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Python itself does not come with any scientific algorithms. However, over time, many third-party libraries emerged that are useful to build machine learning applications. In this context, \"third-party\" means that the libraries are *not* part of Python's standard library.\n",
"\n",
"Among the popular ones are [numpy <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_np.png\">](https://numpy.org/) (numerical computations, linear algebra), [pandas <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_pd.png\">](https://pandas.pydata.org/) (data processing), [matplotlib <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_plt.png\">](https://matplotlib.org/) (visualisations), and [scikit-learn <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_skl.png\">](https://scikit-learn.org/stable/index.html) (machine learning algorithms)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Extending Python with Third-party Packages"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Before we can import these libraries, we must ensure that they installed on our computers. If you installed Python via the Anaconda Distribution that should already be the case. Otherwise, we can use Python's **package manager** `pip` to install them manually.\n",
"\n",
"`pip` is a so-called command-line interface (CLI), meaning it is a program that is run within a terminal window. JupyterLab allows us to run such a CLI tool from within a notebook by starting a code cell with a single `!` symbol. Here, this does not mean Python's modulo operator but is just an instruction to JupyterLab that the following code is *not* Python.\n",
"\n",
"So, let's proceed by installing [numpy <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_np.png\">](https://numpy.org/) and [matplotlib <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_plt.png\">](https://matplotlib.org/)."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: numpy in /home/instructor/Repositories/intro-to-data-science/.venv/lib/python3.12/site-packages (2.0.0)\n"
]
}
],
"source": [
"!pip install numpy"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: matplotlib in /home/instructor/Repositories/intro-to-data-science/.venv/lib/python3.12/site-packages (3.9.1)\n",
"Requirement already satisfied: contourpy>=1.0.1 in /home/instructor/Repositories/intro-to-data-science/.venv/lib/python3.12/site-packages (from matplotlib) (1.2.1)\n",
"Requirement already satisfied: cycler>=0.10 in /home/instructor/Repositories/intro-to-data-science/.venv/lib/python3.12/site-packages (from matplotlib) (0.12.1)\n",
"Requirement already satisfied: fonttools>=4.22.0 in /home/instructor/Repositories/intro-to-data-science/.venv/lib/python3.12/site-packages (from matplotlib) (4.53.1)\n",
"Requirement already satisfied: kiwisolver>=1.3.1 in /home/instructor/Repositories/intro-to-data-science/.venv/lib/python3.12/site-packages (from matplotlib) (1.4.5)\n",
"Requirement already satisfied: numpy>=1.23 in /home/instructor/Repositories/intro-to-data-science/.venv/lib/python3.12/site-packages (from matplotlib) (2.0.0)\n",
"Requirement already satisfied: packaging>=20.0 in /home/instructor/Repositories/intro-to-data-science/.venv/lib/python3.12/site-packages (from matplotlib) (24.1)\n",
"Requirement already satisfied: pillow>=8 in /home/instructor/Repositories/intro-to-data-science/.venv/lib/python3.12/site-packages (from matplotlib) (10.4.0)\n",
"Requirement already satisfied: pyparsing>=2.3.1 in /home/instructor/Repositories/intro-to-data-science/.venv/lib/python3.12/site-packages (from matplotlib) (3.1.2)\n",
"Requirement already satisfied: python-dateutil>=2.7 in /home/instructor/Repositories/intro-to-data-science/.venv/lib/python3.12/site-packages (from matplotlib) (2.9.0.post0)\n",
"Requirement already satisfied: six>=1.5 in /home/instructor/Repositories/intro-to-data-science/.venv/lib/python3.12/site-packages (from python-dateutil>=2.7->matplotlib) (1.16.0)\n"
]
}
],
"source": [
"!pip install matplotlib"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"After we have ensured that the third-party libraries are installed locally, we can simply go ahead with the `import` statement. All the libraries are commonly imported with shorter prefixes for convenient use later on."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's see how the data type provided by these scientific libraries differ from Python's built-in ones."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Vectors and Matrices with Numpy"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As an example, let's start by creating a `list` object."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[1, 2, 3, 4, 5]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"vector = [1, 2, 3, 4, 5]\n",
"\n",
"vector"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We call the `list` object by the name `vector` as that is what the data is supposed to mean conceptually. As we remember from our linear algebra courses, vectors should implement scalar-multiplication. So, the following code cell should result in `[3, 6, 9, 12, 15]` as the answer. Surprisingly, the result is a new `list` with all the elements in `vector` repeated three times. That operation is called **concatenation** and is an example of a concept called **operator overloading**. That means that an operator, like `*` in the example, may exhibit a different behavior depending on the data type of its operands."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"3 * vector"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[numpy <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_np.png\">](https://numpy.org/), among others, provides a data type called an **n-dimensional array**. This may sound fancy at first but when used with only 1 or 2 dimensions, it basically represents vectors and matrices as we know them from linear algebra. Additionally, arrays allow for much faster computations as they are implemented in the very efficient [C language <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_wiki.png\">](https://en.wikipedia.org/wiki/C_%28programming_language%29) and optimized for numerical operations."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To create an array, we use the [np.array() <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_np.png\">](https://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html#numpy-array) constructor and provide it a `list` of values."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([1, 2, 3, 4, 5])"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"v1 = np.array([1, 2, 3, 4, 5])\n",
"\n",
"v1"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"numpy.ndarray"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(v1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The vector `v1` can now be multiplied with a scalar yielding a result meaningful in the context of linear algebra."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 3, 6, 9, 12, 15])"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"v2 = 3 * v1\n",
"\n",
"v2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To model a matrix, we use a `list` of (row) `list`s of values. Note how the output below the cell contains *two* levels of brackets `[` and `]`."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 1, 2, 3, 4, 5],\n",
" [ 6, 7, 8, 9, 10]])"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m1 = np.array(\n",
" [\n",
" [1, 2, 3, 4, 5],\n",
" [6, 7, 8, 9, 10],\n",
" ]\n",
")\n",
"\n",
"m1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we can use the [np.dot() <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_np.png\">](https://numpy.org/doc/stable/reference/generated/numpy.dot.html#numpy.dot) function to multiply a matrix with a vector to obtain a new vector ..."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 55, 130])"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"v3 = np.dot(m1, v1)\n",
"\n",
"v3"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"... or simply transpose it by accessing its [.T <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_np.png\">](https://numpy.org/doc/stable/reference/generated/numpy.ndarray.T.html#numpy.ndarray.T) attribute."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 1, 6],\n",
" [ 2, 7],\n",
" [ 3, 8],\n",
" [ 4, 9],\n",
" [ 5, 10]])"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m1.T"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The rules from maths still apply and it makes a difference if a vector is multiplied from the left or the right by a matrix. The following operation will fail."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"ename": "ValueError",
"evalue": "shapes (5,) and (2,5) not aligned: 5 (dim 0) != 2 (dim 0)",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn[12], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mnp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdot\u001b[49m\u001b[43m(\u001b[49m\u001b[43mv1\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mm1\u001b[49m\u001b[43m)\u001b[49m\n",
"\u001b[0;31mValueError\u001b[0m: shapes (5,) and (2,5) not aligned: 5 (dim 0) != 2 (dim 0)"
]
}
],
"source": [
"np.dot(v1, m1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Indexing & Slicing"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In order to retrieve only a subset of an array's data, we index or slice into it. This is similar to how we index or slice into `list` objects, in particular, if we deal with one-dimensional arrays like `v1`, `v2`, or `v3`."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([1, 2, 3, 4, 5])"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"v1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Indexing may be done with either positive (`0`-based) indexes from the left or negative (`1`-based) indexes from the right.\n",
"\n",
"Here, we obtain the first and the last element in `v1`."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"np.int64(1)"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"v1[0]"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"np.int64(5)"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"v1[-1]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Slicing uses the same `:` notation as with `list`s taking *start*, *stop*, and *step* values."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([2, 3, 4])"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"v1[1:-1]"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([3, 4, 5])"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"v1[2:]"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([1, 2, 3, 4])"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"v1[:-1]"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([2, 4])"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"v1[1:-1:2]"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([1, 3, 5])"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"v1[::2]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Indexing and slicing become slightly more complicated when working with higher dimensional arrays like `m1`. In principle, we must provide either an index or a slice for *each* dimension."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 1, 2, 3, 4, 5],\n",
" [ 6, 7, 8, 9, 10]])"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For example, to slice out the first row of the matrix, we write `[0, :]`. The `0` implies taking elements in *only* the *first* row and the `:` means taking elements across *all* columns."
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([1, 2, 3, 4, 5])"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m1[0, :]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For sure, we could also *not* leave out the *start* and *stop* values along the second dimension and obtain the same result. But that would not only be unneccessary but also communicate a different meaning, namely to \"take elements from the first through the fifth columns\" instead of \"take elements from all columns.\""
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([1, 2, 3, 4, 5])"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m1[0, 0:5]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Whenever we take *all* elements in *later* dimensions (i.e., those more to the right), we may also drop the index or slice instead and keep only the *earlier* ones. However, the previous style is a bit more explicit in that we are working with a two-dimensional array."
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([1, 2, 3, 4, 5])"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m1[0]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As another example, let's slice out elements across *all* rows but in only the *second* column. Colloquially, we can say that we \"slice out the second column\" from the matrix."
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([2, 7])"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m1[:, 1]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If we wanted to slice out a smaller matrix from a larger one, we slice along both dimensions. Above, we have only sliced along one dimension while indexing into the other.\n",
"\n",
"For example, to obtain a 2x2 square matrix consisting of the two left-most columns in `m1`, we can write the following."
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[1, 2],\n",
" [6, 7]])"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m1[:2, :2]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Similarly, to slice out a 2x2 matrix consisting of the two right-most columns, we write the following."
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 4, 5],\n",
" [ 9, 10]])"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m1[-2:, -2:]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To access individual elements as scalars, we combine two indexes along both dimensions.\n",
"\n",
"For example, to access the element in the lower-left corner, we write the following."
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"np.int64(6)"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m1[1, 0]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Dimensionality vs. Shapes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Both, the vectors `v1`, `v2`, and `v3`, and the matrix `m1` have the *same* **data type** from a technical point of view, namely `np.ndarray`."
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"numpy.ndarray"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(v1)"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"numpy.ndarray"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(m1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So, how can we tell that they have different dimensions without looking at how they are displayed below a code cell?\n",
"\n",
"The `np.ndarray` type comes with a couple of **properties** that we can access via the dot notation. Examples are `.ndim` and `.shape`.\n",
"\n",
"While `.ndim` simply tells us how many dimensions an array has, ..."
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"v1.ndim"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"2"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m1.ndim"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"... `.shape` reveals the structure of the elements. The one-element tuple `(5,)` below says that there is one dimension along which there are five elements ..."
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(5,)"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"v1.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"... whereas the two-element tuple `(2, 5)` indicates that the array's elements are placed along two dimensions spanning a grid of two elements in one and five elements into the other dimension. We know such notations already from our linear algebra courses where we would call `m1` a 2x5 matrix."
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(2, 5)"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m1.shape"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There is a relationship behind the dimensionality of an array we are slicing and indexing and what we get back as a result: Whenever we index into an array along some dimension, the result will have one dimension less than the original.\n",
"\n",
"For example, if we start with a two-dimensional array like `m1` and slice along both dimensions, the result will also have two dimensions, even if it holds only one element."
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 1, 2, 3, 4, 5],\n",
" [ 6, 7, 8, 9, 10]])"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m1"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[1]])"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m1[:1, :1] # Note the double brackets"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If, on the contrary, we slice only along one of the two dimensions and index into the other, the result is a one-dimensional array. So, both of the below slices have the *same* properties and we cannot tell if one of them was (part of) a row or column in `m1`."
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([6, 7])"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m1[1, :2]"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([ 5, 10])"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m1[:, -1]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Finally, indexing along both dimensions gives us back a scalar value."
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"np.int64(1)"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"m1[0, 0]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Array Constructors & Functions"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[numpy <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_np.png\">](https://numpy.org/) provides various **constructors** (i.e., functions) to create all kinds of arrays.\n",
"\n",
"For example, [np.linspace() <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_np.png\">](https://numpy.org/doc/stable/reference/generated/numpy.linspace.html#numpy.linspace) creates an array of equidistant numbers, often used to model the values on a function's x-axis. [np.pi <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_np.png\">](https://numpy.org/doc/stable/reference/constants.html#numpy.pi) is an alias for Python's built-in `math.pi`. The cell below creates `100` coordinate points arranged between $-3\\pi$ and $+3\\pi$."
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([-9.42477796, -9.23437841, -9.04397885, -8.8535793 , -8.66317974,\n",
" -8.47278019, -8.28238063, -8.09198108, -7.90158152, -7.71118197,\n",
" -7.52078241, -7.33038286, -7.1399833 , -6.94958375, -6.75918419,\n",
" -6.56878464, -6.37838508, -6.18798553, -5.99758598, -5.80718642,\n",
" -5.61678687, -5.42638731, -5.23598776, -5.0455882 , -4.85518865,\n",
" -4.66478909, -4.47438954, -4.28398998, -4.09359043, -3.90319087,\n",
" -3.71279132, -3.52239176, -3.33199221, -3.14159265, -2.9511931 ,\n",
" -2.76079354, -2.57039399, -2.37999443, -2.18959488, -1.99919533,\n",
" -1.80879577, -1.61839622, -1.42799666, -1.23759711, -1.04719755,\n",
" -0.856798 , -0.66639844, -0.47599889, -0.28559933, -0.09519978,\n",
" 0.09519978, 0.28559933, 0.47599889, 0.66639844, 0.856798 ,\n",
" 1.04719755, 1.23759711, 1.42799666, 1.61839622, 1.80879577,\n",
" 1.99919533, 2.18959488, 2.37999443, 2.57039399, 2.76079354,\n",
" 2.9511931 , 3.14159265, 3.33199221, 3.52239176, 3.71279132,\n",
" 3.90319087, 4.09359043, 4.28398998, 4.47438954, 4.66478909,\n",
" 4.85518865, 5.0455882 , 5.23598776, 5.42638731, 5.61678687,\n",
" 5.80718642, 5.99758598, 6.18798553, 6.37838508, 6.56878464,\n",
" 6.75918419, 6.94958375, 7.1399833 , 7.33038286, 7.52078241,\n",
" 7.71118197, 7.90158152, 8.09198108, 8.28238063, 8.47278019,\n",
" 8.66317974, 8.8535793 , 9.04397885, 9.23437841, 9.42477796])"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x = np.linspace(-3 * np.pi, 3 * np.pi, 100)\n",
"\n",
"x"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Besides constructors, [numpy <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_np.png\">](https://numpy.org/) provides all kinds of **vectorized** functions. The concept of **vectorization** means that a function is executed once for *each* element in an array. Vectorized functions are one major benefit of using [numpy <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_np.png\">](https://numpy.org/): Not only are they optimized heavily on the C level (i.e., \"behind the scenes\") but also allow us to avoid writing explicit `for`-loops that are for some technical reasons considered \"slow\" in Python.\n",
"\n",
"For example, [np.sin() <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_np.png\">](https://numpy.org/doc/stable/reference/generated/numpy.sin.html#numpy.sin) calculates the sine for each element in the `x` array. The resulting `y` array has thus the same `.shape` as `x`."
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([-3.67394040e-16, -1.89251244e-01, -3.71662456e-01, -5.40640817e-01,\n",
" -6.90079011e-01, -8.14575952e-01, -9.09631995e-01, -9.71811568e-01,\n",
" -9.98867339e-01, -9.89821442e-01, -9.45000819e-01, -8.66025404e-01,\n",
" -7.55749574e-01, -6.18158986e-01, -4.58226522e-01, -2.81732557e-01,\n",
" -9.50560433e-02, 9.50560433e-02, 2.81732557e-01, 4.58226522e-01,\n",
" 6.18158986e-01, 7.55749574e-01, 8.66025404e-01, 9.45000819e-01,\n",
" 9.89821442e-01, 9.98867339e-01, 9.71811568e-01, 9.09631995e-01,\n",
" 8.14575952e-01, 6.90079011e-01, 5.40640817e-01, 3.71662456e-01,\n",
" 1.89251244e-01, -1.22464680e-16, -1.89251244e-01, -3.71662456e-01,\n",
" -5.40640817e-01, -6.90079011e-01, -8.14575952e-01, -9.09631995e-01,\n",
" -9.71811568e-01, -9.98867339e-01, -9.89821442e-01, -9.45000819e-01,\n",
" -8.66025404e-01, -7.55749574e-01, -6.18158986e-01, -4.58226522e-01,\n",
" -2.81732557e-01, -9.50560433e-02, 9.50560433e-02, 2.81732557e-01,\n",
" 4.58226522e-01, 6.18158986e-01, 7.55749574e-01, 8.66025404e-01,\n",
" 9.45000819e-01, 9.89821442e-01, 9.98867339e-01, 9.71811568e-01,\n",
" 9.09631995e-01, 8.14575952e-01, 6.90079011e-01, 5.40640817e-01,\n",
" 3.71662456e-01, 1.89251244e-01, 1.22464680e-16, -1.89251244e-01,\n",
" -3.71662456e-01, -5.40640817e-01, -6.90079011e-01, -8.14575952e-01,\n",
" -9.09631995e-01, -9.71811568e-01, -9.98867339e-01, -9.89821442e-01,\n",
" -9.45000819e-01, -8.66025404e-01, -7.55749574e-01, -6.18158986e-01,\n",
" -4.58226522e-01, -2.81732557e-01, -9.50560433e-02, 9.50560433e-02,\n",
" 2.81732557e-01, 4.58226522e-01, 6.18158986e-01, 7.55749574e-01,\n",
" 8.66025404e-01, 9.45000819e-01, 9.89821442e-01, 9.98867339e-01,\n",
" 9.71811568e-01, 9.09631995e-01, 8.14575952e-01, 6.90079011e-01,\n",
" 5.40640817e-01, 3.71662456e-01, 1.89251244e-01, 3.67394040e-16])"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y = np.sin(x)\n",
"\n",
"y"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, let's use [matplotlib <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_plt.png\">](https://matplotlib.org/)'s [plt.plot() <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_plt.png\">](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.plot.html#matplotlib.pyplot.plot) function to visualize the sine curve between $-3\\pi$ and $+3\\pi$."
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f008d3be6a0>]"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(x, y)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If we use only `10` equidistant points for `x`, the resulting curve does not look like a curve. There is a trade-off behind this: To make nice plots, we need a rather high granularity of data points. That, however, causes more computations in the background making the plotting slower. With toy data like the one here this is not an issue. For real life data that may be different."
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f008b2bff10>]"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"x = np.linspace(-3 * np.pi, 3 * np.pi, 10)\n",
"y = np.sin(x)\n",
"\n",
"plt.plot(x, y)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[numpy <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_np.png\">](https://numpy.org/) provides further constructors. Most notably are the ones in the [np.random <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_np.png\">](https://numpy.org/doc/stable/reference/random/index.html#module-numpy.random) module that mirrors the [random <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_py.png\">](https://docs.python.org/3/library/random.html) module in the [standard library <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_py.png\">](https://docs.python.org/3/library/index.html): For example, [np.random.normal() <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_np.png\">](https://numpy.org/doc/stable/reference/random/generated/numpy.random.normal.html#numpy.random.normal) and [np.random.gamma() <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_np.png\">](https://numpy.org/doc/stable/reference/random/generated/numpy.random.gamma.html#numpy.random.gamma) return arrays whose elements follow the normal and gamma probability distributions."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, let's set the [np.random.seed() <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_np.png\">](https://docs.python.org/3/library/random.html#random.seed) to make the random numbers *replicable* on separate runs of this notebook."
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [],
"source": [
"np.random.seed(42)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Then, let us quickly generate some random data points and draw a scatter plot with [matplotlib <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_plt.png\">](https://matplotlib.org/)'s [plt.scatter() <img height=\"12\" style=\"display: inline-block\" src=\"../static/link/to_plt.png\">](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.scatter.html#matplotlib.pyplot.scatter) function."
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.collections.PathCollection at 0x7f008b235d00>"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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q/bu3au7775bGzZsUFVVld/N8ZWTfZHJZHTdddeprq5ODz30kJkGGlRoX7z00kuxOYcW2hdxO3/a+T1x5Rzq1lhRUMycOdO64447rLvvvttKJBJWeXl575ckq6yszLryyiv9bqYx2f3x3nvvWZKsf/3Xf+3z/o033mjddNNNPrXOrOy+2L17tyXJam5uHvD+nXfe6VPrvLN27VpL0oDfhezvx8aNGy1J1scff9zn302YMMH6x3/8R38a7ZFC++IPf/iDZVmWlclkrPr6emvmzJnWJ5984nOrvVFoXyxZsiQ259BC+yJ7zojL+dPu/ij1HBr6HpD+uru71dnZqeXLl+trX/tan/cuuOACPf7442poaPCpdeZl98eZZ56pcePGadeuXX3e/+1vf6u5c+f61Dqzsvvi6NGjkjRg9np5eXnvnU6UzJw5U2+//Xaf126//Xadd955uu+++zR+/HhVVFRo06ZNmj9/viRp165d+uCDD3rnzERFoX1RXl6uTCaj2bNnq7KyUi+99FJke40K7YvRo0frzjvv7PN+VM+hhfbFWWedFavzZ6H94dY5NNQB5P7779fcuXM1YcIEHTp0SKtXr9bPf/5zvfzyy0qlUjknTU2YMEETJ070obXeG2x/JBIJfeMb39CyZct04YUX6qKLLtIzzzyjd955Rz/60Y/8brrrBtsX5513niZPnqw777xTjz32mEaNGqV169Zpw4YN+slPfuJ30103YsQITZkypc9rw4cP16hRo3pfX7hwoZYuXaqamhpVV1frrrvuUn19vS699FI/muyZQvsik8nommuu0dGjR7Vq1SplMhllMhlJ0qmnnqry8nI/mu0JO8dFXM6hdvZFnM6fhfbHsWPHXDmHhjqAfPjhh7r11lvV2tqqZDKpqVOn6uWXX9bVV1/td9N8UWh/3HPPPero6NC9996r9vZ2XXjhhdqwYYMmTZrkc8vdV2hf/PSnP9U3v/lNNTQ06PDhw5o8ebKeeeYZXXvttT633B+PP/64ysrKNH/+fHV2dmr27Nn63ve+53ezjNu+fbtee+01SRowma6lpUVnnnmmD61CEMTp/FlIRUWFK+fQhGVZloftBAAAGCAydUAAAEB4EEAAAIBxBBAAAGAcAQQAABhHAAEAAMYRQAAAgHEEEAAAYBwBBAAAGEcAAQAAxhFAAACAcQQQAABgHAEEAAAY9/8BAOZdE7QjWKkAAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"x = np.random.normal(42, 3, 100)\n",
"y = np.random.gamma(7, 1, 100)\n",
"\n",
"plt.scatter(x, y)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "intro-to-data-science",
"language": "python",
"name": "intro-to-data-science"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.4"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": false,
"sideBar": true,
"skip_h1_title": false,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}