Skip to content

Instantly share code, notes, and snippets.

@cbcunc
Last active July 4, 2016 13:56
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cbcunc/2be74d1c7a65eafa56b4 to your computer and use it in GitHub Desktop.
Save cbcunc/2be74d1c7a65eafa56b4 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Numpy Basics\n",
"\n",
"# Chris Calloway\n",
"\n",
"# UNC Renaissance Computing Institute (RENCI)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# A word about me.\n",
"\n",
"My name is Chris Calloway.\n",
"\n",
"I'm an Applications Analyst at **RENCI** (a UNC System research institute in Chapel Hill).\n",
"\n",
"I work with marine data, especially hurricane model data.\n",
"\n",
"I also volunteer my time to the Triangle Python Users Group (**TriPython**).\n",
"\n",
"My email is cbc@unc.edu."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Sidebar\n",
"\n",
"BTW, TriPython and Research Triangle Analysts are working together to bring **PyData**, a 400-person conference about data science with Python, to IBM RTP, **September 14-16**. It will be epic."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# A word about the topic.\n",
"\n",
"This talk is basic.\n",
"\n",
"It is about a Python package called **NumPy**.\n",
"\n",
"NumPy is used by most all Python data science packages.\n",
"\n",
"So you need to know NumPy fairly thoroughly to be moderately proficient at data science with Python.\n",
"\n",
"These are the basics about a very basic package."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# A word about this talk.\n",
"\n",
"It will go quickly.\n",
"\n",
"It is using **Jupyter**, an through-the-browser interactive and collaborative environment for data science.\n",
"\n",
"Jupyter used to be called \"Ipython Notebook,\" if you've heard of that.\n",
"\n",
"Jupyter stands for \"Julia, Python and R.\" But Jupyter works with all kinds of back ends, such as Matlab.\n",
"\n",
"With Jupyter, you create \"notebooks,\" a sequence of code, text, and graphic \"cells\" which tell a data science story.\n",
"\n",
"I convert my notebook for this talk into a **reveal.js** presentation of static slides with a Jupyter tool called **nbconvert**.\n",
"\n",
"You can get ths interactive notebook and follow along at http://tinyurl.com/af16numpy"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# A word about Python.\n",
"\n",
"This talk is in Python 3.\n",
"\n",
"If you run this notebook yourself, you will need Python 3.\n",
"\n",
"Python 2 is just as useful and works 95% the same as Python 3.\n",
"\n",
"I hate to quibble about which Python is best. They are both great and both do data science well.\n",
"\n",
"Python is easy to install, especially if you get a distribution of Python from python.org.\n",
"\n",
"However, some Python data science tools can be very hard to install on top of the Python from python.org.\n",
"\n",
"Some require you to have very specific C++ and Fortran compilers as well as linear algebra libraries compiled with special flags in order to work efficiently.\n",
"\n",
"That can be doubly hard on Windows.\n",
"\n",
"The best solution is to get a Python distribution that already has the data science tools pre-bundled for your OS.\n",
"\n",
"This will save you a lot of time and leverage the work of data science tool packaging experts.\n",
"\n",
"The best such distribution is **Anaconda** from Continuum Analytics. See http://continuum.io"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Python lists are a lot like Python arrays.\n",
"\n",
"* Lists, like arrays, are **ORDERED** collections of objects.\n",
"\n",
"* Many, but not all, things you can do with lists, you can do with arrays."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Create an unbound empty list\n",
"\n",
"* from a literal representation"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"[]"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[]"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Create an unbound list\n",
"\n",
"* with the built-in list object\n",
"* using any collection type an an argument\n",
"* such as a string"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"['J', 'u', 'p', 'y', 't', 'e', 'r']"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"list(\"Jupyter\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Create a list\n",
"\n",
"* bound to the identifier \"lst\"\n",
"* from a literal representation"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1, 2, 3]\n"
]
}
],
"source": [
"lst = [1, 2, 3,]\n",
"print(lst)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Most list manipulation occurs with the subscription operator: [ ] \n",
"\n",
"* And a zero-based **INDEX**."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Access an ELEMENT of a list\n",
"* lists are **ZERO-BASED**\n",
"* second element of the list"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"2"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lst[1]"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"### First element"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"1"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lst[0]"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"### Last element"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"3"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lst[-1]"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# List Mutation\n",
"\n",
"### Add an element\n",
"\n",
"* Can't do this with arrays\n",
"* Arrays are fixed length"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1, 2, 3, 100]\n"
]
}
],
"source": [
"lst.append(100)\n",
"print(lst)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# List Mutation\n",
"\n",
"### Change (or replace or set) an element\n",
"\n",
"* Only possible array mutation\n",
"* Doesn't change the length of the collection"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1, 5, 3, 100]\n"
]
}
],
"source": [
"lst[1] = 5\n",
"print(lst)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# List Mutation\n",
"\n",
"### Delete an element\n",
"\n",
"* Can't do this with arrays\n",
"* Arrays are fixed length"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1, 5, 100]\n"
]
}
],
"source": [
"del lst[2]\n",
"print(lst)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Concatenate lists\n",
"\n",
"* Makes a new list object"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"[1, 2, 3, 11, 12, 13]"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[1, 2, 3,] + [11, 12, 13,]"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Repeat a list\n",
"\n",
"* Makes a new list object"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"[1, 2, 3,] * 5"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Slice a list\n",
"\n",
"* Makes a new list object"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"[3, 4, 5, 6, 7]"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10,]\n",
"lst[2:7]"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Slice lists stepwise\n"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"[2, 5, 8]"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lst[1:10:3]"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"# Slice backwards"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"[10, 7, 4]"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lst[9:2:-3]"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Slice the the end of the list"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"[6, 7, 8, 9, 10]"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lst[5:]"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"# Slice up to an index"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"[1, 2, 3, 4, 5]"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lst[:5]"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# List Mutation\n",
"\n",
"### Replace a slice with another\n",
"\n",
"* **ARBITRARY** size"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1, 2, -1, -2, -3, 8, 9, 10]\n"
]
}
],
"source": [
"lst[2:7] = [-1, -2, -3]\n",
"print(lst)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# List Mutation\n",
"\n",
"### Replace a slice stepwise\n",
"\n",
"* **SIZE MUST MATCH!**"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1, -1, 3, 4, -2, 6, 7, -3, 9, 10]\n"
]
}
],
"source": [
"lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10,]\n",
"lst[1:10:3] = [-1, -2, -3]\n",
"print(lst)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Make a copy of a list\n",
"\n",
"* A copy can be independently mutated"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1, -1, 3, 4, -2, 6, 7, -3, 9, 10]\n",
"Same object? False\n",
"Equivalent objects? True\n"
]
}
],
"source": [
"newlist = lst[:]\n",
"print(newlist)\n",
"print(\"Same object?\", newlist is lst)\n",
"print(\"Equivalent objects?\", newlist == lst)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Make a multidimensional list of lists\n",
"\n",
"* Rows may be different sizes\n",
"* Unlike multidimensional arrays"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11, 12]]\n",
"6\n"
]
}
],
"source": [
"lst2d = [[1, 2, 3],\n",
" [4, 5, 6, 7],\n",
" [8, 9, 10, 11, 12],]\n",
"print(lst2d)\n",
"print(lst2d[1][2])"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# The main difference between lists and arrays?\n",
"\n",
"* lists are **HETEROGENEOUS**\n",
"* ordered collections of objects\n",
"* of **ARBITRARY** data types"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'bool'>\n",
"<class 'int'>\n",
"<class 'float'>\n",
"<class 'complex'>\n",
"<class 'str'>\n",
"<class 'builtin_function_or_method'>\n",
"<class 'NoneType'>\n"
]
}
],
"source": [
"lst = [False, 1, 2.0, 3+4j, \"five\", min, None]\n",
"for element in lst:\n",
" print(type(element)),"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Arrays are Homogeneous\n",
"\n",
"* ordered collections of objects\n",
"* of the **SAME** data type"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"* Arrays are also fixed size\n",
" * No additional cells\n",
" * No cell deletion"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"* For a multidimesional array\n",
" * the dimension of each axis\n",
" * fixed at array creation"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# The numpy package\n",
"\n",
"* Implements Python arrays\n",
"* The np identifier is conventional"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": true,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [],
"source": [
"import numpy as np"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# The np.array function\n",
"\n",
"* takes an object\n",
"* which implements the **ARRAY PROTOCOL**\n",
" * collections which can get and set elements\n",
" * all the same data type\n",
" * equal length rows\n",
"* as an argument\n",
"* such as a list or another array"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[10 20 30 40]\n"
]
},
{
"data": {
"text/plain": [
"array([10, 20, 30, 40])"
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"arr = np.array([10, 20, 30, 40,])\n",
"print(arr)\n",
"arr"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Access a CELL of an array\n",
"\n",
"* **ZERO-BASED**"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"30"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"arr[2]"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"### First cell"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"10"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"arr[0]"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"### Last cell"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"40"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"arr[-1]"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# A Slice of cells\n",
"\n",
"* Does not create a copy\n",
"* Creates a **VIEW**"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[20 30]\n"
]
}
],
"source": [
"barr = arr[1:3]\n",
"print(barr)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"* Changes to the view\n",
" * Are reflected in the parent\n",
" * And vice-versa"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 10 1000 30 40]\n"
]
}
],
"source": [
"barr[0] = 1000\n",
"print(arr)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Stepwise slice"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([10, 30])"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"arr[::2]"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"### Replace a slice\n",
"\n",
"* **SIZE MUST MATCH!**"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[10 50 60 40]\n"
]
}
],
"source": [
"arr[1:3] = np.array([50, 60])\n",
"print(arr)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"### Replace a slice stepwise\n",
"\n",
"* **SIZE MUST MATCH!**"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[70 50 80 40]\n"
]
}
],
"source": [
"arr[::2] = np.array([70, 80])\n",
"print(arr)"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true,
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Handy Attributes: dtype"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"dtype('int64')"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"arr.dtype"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
"dtype('float64')"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"arr = np.array([10., 20., 30., 40.,])\n",
"arr.dtype"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([ 10.+0.j, 20.+0.j, 30.+0.j, 40.+0.j])"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"arr = np.array([10., 20., 30., 40.,], dtype=np.complex128)\n",
"arr.dtype\n",
"arr"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# List of simple dtypes"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"{'complex': [numpy.complex64, numpy.complex128, numpy.complex256],\n",
" 'float': [numpy.float16, numpy.float32, numpy.float64, numpy.float128],\n",
" 'int': [numpy.int8, numpy.int16, numpy.int32, numpy.int64],\n",
" 'others': [bool, object, str, str, numpy.void],\n",
" 'uint': [numpy.uint8, numpy.uint16, numpy.uint32, numpy.uint64]}"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.sctypes"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Handy Attributes: ndim"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"1"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"arr.ndim"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[1 2 3]\n",
" [4 5 6]\n",
" [7 8 9]]\n"
]
},
{
"data": {
"text/plain": [
"2"
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"arr2 = np.array([[1, 2, 3,], [4, 5 ,6,], [7, 8, 9]])\n",
"print(arr2) \n",
"arr2.ndim"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Handy Attributes: ndim"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[[ 1 2 3]\n",
" [ 4 5 6]\n",
" [ 7 8 9]]\n",
"\n",
" [[11 12 13]\n",
" [14 15 16]\n",
" [17 18 19]]]\n"
]
},
{
"data": {
"text/plain": [
"3"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"arr3 = np.array([[[1, 2, 3], [4, 5, 6], [7, 8, 9]],\n",
" [[11, 12, 13], [14, 15, 16], [17, 18, 19]]])\n",
"print(arr3)\n",
"arr3.ndim"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Handy Attributes: shape"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(4,)"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"arr.shape"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
"(3, 3)"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"arr2.shape"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
"(2, 3, 3)"
]
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"arr3.shape"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Handy Attributes: size"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"4"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"arr.size"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
"9"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"arr2.size"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
"18"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"arr3.size"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Handy Attributes: itemsize"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"1"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"u8arr = arr = np.array([2, 3, 5], dtype=np.uint8)\n",
"u8arr.itemsize"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
"8"
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"iarr = arr = np.array([2, 3, 5], dtype=np.int)\n",
"iarr.itemsize"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
"16"
]
},
"execution_count": 47,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"farr = arr = np.array([2, 3, 5], dtype=np.float128)\n",
"farr.itemsize"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Handy Attributes: nbytes"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"3"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"u8arr.nbytes"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
"24"
]
},
"execution_count": 49,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"iarr.nbytes"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
"48"
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"farr.nbytes"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Handy Attributes: base"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[1 2 3]\n",
" [4 5 6]\n",
" [7 8 9]]\n"
]
}
],
"source": [
"print(arr2)"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[7 8 9]]\n"
]
}
],
"source": [
"varr2 = arr2[2:]\n",
"print(varr2)"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[1 2 3]\n",
" [4 5 6]\n",
" [7 8 9]]\n"
]
}
],
"source": [
"print(varr2.base)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Handy Attributes: T (for Transpose)"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[1 2 3]\n",
" [4 5 6]\n",
" [7 8 9]]\n"
]
}
],
"source": [
"print(arr2)"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[1 4 7]\n",
" [2 5 8]\n",
" [3 6 9]]\n"
]
}
],
"source": [
"print(arr2.T)"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 1 2 3]\n",
" [ 4 50 6]\n",
" [ 7 8 9]]\n"
]
}
],
"source": [
"arr2.T[1,1] = 50\n",
"print(arr2)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Handy Attributes: flat\n",
"\n",
"* Evaluates to an iterator"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 2 3 4 5 6 7 8 9 11 12 13 14 15 16 17 18 19 "
]
}
],
"source": [
"for x in arr3.flat: print(x, end=\" \")"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Handy Functions: zeros\n",
"\n",
"* First argument: shape tuple\n",
"* Must specify a dtype"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[[0, 0, 0, 0],\n",
" [0, 0, 0, 0],\n",
" [0, 0, 0, 0]],\n",
"\n",
" [[0, 0, 0, 0],\n",
" [0, 0, 0, 0],\n",
" [0, 0, 0, 0]]])"
]
},
"execution_count": 58,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.zeros((2, 3, 4 ), dtype=np.int)"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([[[4, 4, 4, 4],\n",
" [4, 4, 4, 4],\n",
" [4, 4, 4, 4]],\n",
"\n",
" [[4, 4, 4, 4],\n",
" [4, 4, 4, 4],\n",
" [4, 4, 4, 4]]])"
]
},
"execution_count": 59,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.zeros((2, 3, 4), dtype=np.int) + 4"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Handy Functions: empty\n",
"\n",
"* Only marginally faster than zeros\n",
"* Does not clear memory like zeros\n",
"* Contents of cells are unpredictable"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[[0, 0, 0, 0],\n",
" [0, 0, 0, 0],\n",
" [0, 0, 0, 0]],\n",
"\n",
" [[0, 0, 0, 0],\n",
" [0, 0, 0, 0],\n",
" [0, 0, 0, 0]]])"
]
},
"execution_count": 60,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.empty((2, 3, 4), dtype=np.int)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Handy Functions: ones"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[[1, 1, 1, 1],\n",
" [1, 1, 1, 1],\n",
" [1, 1, 1, 1]],\n",
"\n",
" [[1, 1, 1, 1],\n",
" [1, 1, 1, 1],\n",
" [1, 1, 1, 1]]])"
]
},
"execution_count": 61,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.ones((2, 3, 4), dtype=np.int)"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([[[5, 5, 5, 5],\n",
" [5, 5, 5, 5],\n",
" [5, 5, 5, 5]],\n",
"\n",
" [[5, 5, 5, 5],\n",
" [5, 5, 5, 5],\n",
" [5, 5, 5, 5]]])"
]
},
"execution_count": 62,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.ones((2, 3, 4), dtype=np.int) * 5"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Handy Functions: arange\n",
"\n",
"### Stop argument"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])"
]
},
"execution_count": 63,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.arange(10, dtype=np.float)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"### Start and stop arguments"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([ 5, 6, 7, 8, 9, 10, 11, 12])"
]
},
"execution_count": 64,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.arange(5, 13, dtype=np.int64)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"### Start, stop, and step arguments"
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([ 21.+0.j, 24.+0.j, 27.+0.j, 30.+0.j, 33.+0.j, 36.+0.j,\n",
" 39.+0.j, 42.+0.j, 45.+0.j, 48.+0.j])"
]
},
"execution_count": 65,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.arange(21, 50, 3, dtype=np.complex)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Handy Functions: fill"
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ nan, nan],\n",
" [ nan, nan]])"
]
},
"execution_count": 66,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"empty = np.empty((2, 2), dtype=np.float)\n",
"empty.fill(np.nan)\n",
"empty"
]
},
{
"cell_type": "code",
"execution_count": 67,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 3.14159265, 3.14159265],\n",
" [ 3.14159265, 3.14159265]])"
]
},
"execution_count": 67,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"empty = np.empty((2, 2), dtype=np.float)\n",
"empty.fill(np.pi)\n",
"empty"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Handy Functions: linspace and logspace"
]
},
{
"cell_type": "code",
"execution_count": 68,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([ 2. , 2.2, 2.4, 2.6, 2.8, 3. ])"
]
},
"execution_count": 68,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.linspace(2, 3, 6)"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([ 1.00000000e+02, 1.00000000e+03, 1.00000000e+04,\n",
" 1.00000000e+05, 1.00000000e+06])"
]
},
"execution_count": 69,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.logspace(2, 6, 5)"
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([ 7.3890561 , 20.08553692, 54.59815003, 148.4131591 ,\n",
" 403.42879349])"
]
},
"execution_count": 70,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.logspace(2, 6, 5, base=np.e)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Handy Functions: numpy.random.random\n",
"\n",
"* Only argument: shape tuple\n",
"* Random samples\n",
"* From a uniform distribution\n",
"* Between 0 and 1"
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0.83803503, 0.43228551, 0.27979742],\n",
" [ 0.83380584, 0.99073524, 0.41997202],\n",
" [ 0.07729926, 0.04056981, 0.43661081]])"
]
},
"execution_count": 71,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import numpy.random as npr\n",
"\n",
"npr.random((3,3))"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Handy Functions: numpy.random.randn\n",
"\n",
"* Arguments: dimensions\n",
"* Random samples\n",
"* From a normal distribution\n",
"* Median of 0\n",
"* Variance of 1"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 1.21571435, -0.07138056, -2.85458208],\n",
" [ 0.13986207, 1.23625104, -0.90520752],\n",
" [-0.73712028, 0.37929972, 0.88741251]])"
]
},
"execution_count": 72,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"npr.randn(3,3)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Handy Functions: numpy.random.normal\n",
"\n",
"* First argument: median\n",
"* Second argument: variance\n",
"* Third argument: shape tuple\n",
"* From a normal distribution"
]
},
{
"cell_type": "code",
"execution_count": 73,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 11.81409402, 10.18571314, 6.71681281],\n",
" [ 9.43711259, 9.8631515 , 12.52405695],\n",
" [ 13.3516004 , 8.11458051, 15.15069981]])"
]
},
"execution_count": 73,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"npr.normal(10, 3, (3, 3))"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Handy Functions: identity"
]
},
{
"cell_type": "code",
"execution_count": 74,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 1., 0., 0., 0.],\n",
" [ 0., 1., 0., 0.],\n",
" [ 0., 0., 1., 0.],\n",
" [ 0., 0., 0., 1.]])"
]
},
"execution_count": 74,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.identity(4)"
]
},
{
"cell_type": "code",
"execution_count": 75,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 1., 0., 0., 0.],\n",
" [ 0., 1., 0., 0.],\n",
" [ 0., 0., 1., 0.],\n",
" [ 0., 0., 0., 1.]])"
]
},
"execution_count": 75,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.eye(4)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Handy Methods: reshape"
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 2. 2.43478261 2.86956522 3.30434783 3.73913043\n",
" 4.17391304 4.60869565 5.04347826 5.47826087 5.91304348\n",
" 6.34782609 6.7826087 7.2173913 7.65217391 8.08695652\n",
" 8.52173913 8.95652174 9.39130435 9.82608696 10.26086957\n",
" 10.69565217 11.13043478 11.56521739 12. ]\n"
]
}
],
"source": [
"linear = np.linspace(2, 12, 24)\n",
"print(linear)"
]
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 2. 2.43478261 2.86956522 3.30434783 3.73913043\n",
" 4.17391304 4.60869565 5.04347826]\n",
" [ 5.47826087 5.91304348 6.34782609 6.7826087 7.2173913\n",
" 7.65217391 8.08695652 8.52173913]\n",
" [ 8.95652174 9.39130435 9.82608696 10.26086957 10.69565217\n",
" 11.13043478 11.56521739 12. ]]\n"
]
}
],
"source": [
"print(linear.reshape(3, 8))"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Handy Methods: reshape\n",
"\n",
"* Reshape returns a view!"
]
},
{
"cell_type": "code",
"execution_count": 78,
"metadata": {
"collapsed": false,
"scrolled": true,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 2. 2.43478261 2.86956522]\n",
" [ 3.30434783 3.73913043 4.17391304]\n",
" [ 4.60869565 5.04347826 5.47826087]\n",
" [ 5.91304348 6.34782609 6.7826087 ]\n",
" [ 7.2173913 7.65217391 8.08695652]\n",
" [ 8.52173913 8.95652174 9.39130435]\n",
" [ 9.82608696 10.26086957 10.69565217]\n",
" [ 11.13043478 11.56521739 12. ]]\n"
]
}
],
"source": [
"print(linear.reshape(8, 3))"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Handy Methods: sum and prod"
]
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"168.0"
]
},
"execution_count": 79,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"linear.sum()"
]
},
{
"cell_type": "code",
"execution_count": 80,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
"1.2458126737356677e+19"
]
},
"execution_count": 80,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"linear.prod()"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Handy Methods: cumsum and cumprod"
]
},
{
"cell_type": "code",
"execution_count": 81,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 2. 4.43478261 7.30434783 10.60869565 14.34782609\n",
" 18.52173913 23.13043478 28.17391304 33.65217391 39.56521739\n",
" 45.91304348 52.69565217 59.91304348 67.56521739 75.65217391\n",
" 84.17391304 93.13043478 102.52173913 112.34782609 122.60869565\n",
" 133.30434783 144.43478261 156. 168. ]\n"
]
}
],
"source": [
"print(linear.cumsum())"
]
},
{
"cell_type": "code",
"execution_count": 82,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 2.00000000e+00 4.86956522e+00 1.39735350e+01 4.61734199e+01\n",
" 1.72648440e+02 7.20619574e+02 3.32111630e+03 1.67499779e+04\n",
" 9.17607482e+04 5.42585294e+05 3.44423708e+06 2.33609124e+07\n",
" 1.68604846e+08 1.29019360e+09 1.04337396e+10 8.89136068e+10\n",
" 7.96356653e+11 7.47882769e+12 7.34876113e+13 7.54046794e+14\n",
" 8.06502223e+15 8.97672039e+16 1.03817723e+18 1.24581267e+19]\n"
]
}
],
"source": [
"print(linear.cumprod())"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Handy Methods: max, min, mean, and ptp"
]
},
{
"cell_type": "code",
"execution_count": 83,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"12.0"
]
},
"execution_count": 83,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"linear.max()"
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
"2.0"
]
},
"execution_count": 84,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"linear.min()"
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
"7.0"
]
},
"execution_count": 85,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"linear.mean()"
]
},
{
"cell_type": "code",
"execution_count": 86,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
"10.0"
]
},
"execution_count": 86,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"linear.ptp()"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Handy Methods: round, std, and var"
]
},
{
"cell_type": "code",
"execution_count": 87,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([ 2., 2., 3., 3., 4., 4., 5., 5., 5., 6., 6.,\n",
" 7., 7., 8., 8., 9., 9., 9., 10., 10., 11., 11.,\n",
" 12., 12.])"
]
},
"execution_count": 87,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"linear.round()"
]
},
{
"cell_type": "code",
"execution_count": 88,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
"3.00964632714423"
]
},
"execution_count": 88,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"linear.std()"
]
},
{
"cell_type": "code",
"execution_count": 89,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
"9.0579710144927521"
]
},
"execution_count": 89,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"linear.var()"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Array Operations Are Element-wise"
]
},
{
"cell_type": "code",
"execution_count": 90,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([5, 7, 9])"
]
},
"execution_count": 90,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.array([1, 2, 3]) + np.array([4, 5, 6])"
]
},
{
"cell_type": "code",
"execution_count": 91,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([ 4, 10, 18])"
]
},
"execution_count": 91,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.array([1, 2, 3]) * np.array([4, 5, 6])"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Numpy Ufuncs: Operations As Functions"
]
},
{
"cell_type": "code",
"execution_count": 92,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([5, 7, 9])"
]
},
"execution_count": 92,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"arr1 = np.array([1, 2, 3])\n",
"arr2 = np.array([4, 5, 6])\n",
"np.add(arr1, arr2)"
]
},
{
"cell_type": "code",
"execution_count": 93,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([ 4, 10, 18])"
]
},
"execution_count": 93,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\n",
"np.multiply(arr1, arr2)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Math Unfuncs"
]
},
{
"cell_type": "raw",
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"source": [
"<table>\n",
"<tr><td> add </td><td> floor_divide </td><td> rint </td><td> log10 </td></tr>\n",
"<tr><td> subtract </td><td> negative </td><td> sign </td><td> expm1 </td></tr>\n",
"<tr><td> multiply </td><td> power </td><td> conj </td><td> log1p </td></tr>\n",
"<tr><td> divide </td><td> remainder </td><td> exp </td><td> sqrt </td></tr>\n",
"<tr><td> logaddexp </td><td> mod </td><td> exp2 </td><td> square </td></tr>\n",
"<tr><td> logaddexp2 </td><td> fmod </td><td> log </td><td> reciprocal </td></tr>\n",
"<tr><td> true_divide </td><td> absolute </td><td> log2 </td><td> ones_like </td></tr>\n",
"</table>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Trig Ufuncs"
]
},
{
"cell_type": "raw",
"metadata": {
"slideshow": {
"slide_type": "-"
}
},
"source": [
"<table>\n",
"<tr><td> sin </td><td> arccos </td><td> sinh </td><td> arccosh </td></tr>\n",
"<tr><td> cos </td><td> arctan </td><td> cosh </td><td> arctanh </td></tr>\n",
"<tr><td> tan </td><td> arctan2 </td><td> tanh </td><td> deg2rad </td></tr>\n",
"<tr><td> arcsin </td><td> hypot </td><td> arcsinh </td><td> rad2deg </td></tr>\n",
"</table>\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Ufuncs For\n",
"\n",
"* Bitwise operations\n",
"* Comparison operations\n",
"* Logical operations\n",
"* Distribution operations\n",
"* Floating point operations\n",
" * isnan\n",
" * isinf\n",
" * ceil"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Ufuncs are Universally Useful"
]
},
{
"cell_type": "code",
"execution_count": 94,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "-"
}
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x10d3c7978>]"
]
},
"execution_count": 94,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10be4ae80>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%matplotlib inline\n",
"import matplotlib.pyplot as plt\n",
"\n",
"linear = np.linspace(0, 10 * np.pi, 1000)\n",
"sine = np.sin(linear ** 1.5)\n",
"plt.plot(sine)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Vectorize: Create Your Own Ufuncs"
]
},
{
"cell_type": "code",
"execution_count": 95,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x10fc4add8>]"
]
},
"execution_count": 95,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n+V9Rgqs343+ZQAAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10d37d240>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def f(x):\n",
" return (x ** 5) - (x ** 4) + (x ** 3) - (x ** 2) + x - 5\n",
"\n",
"vf = np.vectorize(f)\n",
"linear = np.linspace(-10, 10, 100)\n",
"solution = vf(linear)\n",
"plt.plot(solution)\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Array Indexing"
]
},
{
"cell_type": "code",
"execution_count": 96,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([False, True, True, True, True, True, True, True, True,\n",
" True, True, True, True, True, True, True, True, True,\n",
" True, True, True, True, True, True, True, False, False,\n",
" False, False, False, False, False, False, False, False, False,\n",
" False, False, False, False, False, False, False, False, False,\n",
" False, False, False, False, False, True, True, True, True,\n",
" True, True, True, True, True, True, True, True, True,\n",
" True, True, True, True, True, True, True, True, True,\n",
" True, True, True, False, False, False, False, False, False,\n",
" False, False, False, False, False, False, False, False, False,\n",
" False, False, False, False, False, False, False, False, False, False], dtype=bool)"
]
},
"execution_count": 96,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"linear = np.linspace(0, 4 * np.pi, 100)\n",
"sine = np.sin(linear)\n",
"positive = sine > 0\n",
"positive"
]
},
{
"cell_type": "code",
"execution_count": 97,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([ 0.00000000e+00, 1.26592454e-01, 2.51147987e-01,\n",
" 3.71662456e-01, 4.86196736e-01, 5.92907929e-01,\n",
" 6.90079011e-01, 7.76146464e-01, 8.49725430e-01,\n",
" 9.09631995e-01, 9.54902241e-01, 9.84807753e-01,\n",
" 9.98867339e-01, 9.96854776e-01, 9.78802446e-01,\n",
" 9.45000819e-01, 8.95993774e-01, 8.32569855e-01,\n",
" 7.55749574e-01, 6.66769001e-01, 5.67059864e-01,\n",
" 4.58226522e-01, 3.42020143e-01, 2.20310533e-01,\n",
" 9.50560433e-02, -3.17279335e-02, -1.58001396e-01,\n",
" -2.81732557e-01, -4.00930535e-01, -5.13677392e-01,\n",
" -6.18158986e-01, -7.12694171e-01, -7.95761841e-01,\n",
" -8.66025404e-01, -9.22354294e-01, -9.63842159e-01,\n",
" -9.89821442e-01, -9.99874128e-01, -9.93838464e-01,\n",
" -9.71811568e-01, -9.34147860e-01, -8.81453363e-01,\n",
" -8.14575952e-01, -7.34591709e-01, -6.42787610e-01,\n",
" -5.40640817e-01, -4.29794912e-01, -3.12033446e-01,\n",
" -1.89251244e-01, -6.34239197e-02, 6.34239197e-02,\n",
" 1.89251244e-01, 3.12033446e-01, 4.29794912e-01,\n",
" 5.40640817e-01, 6.42787610e-01, 7.34591709e-01,\n",
" 8.14575952e-01, 8.81453363e-01, 9.34147860e-01,\n",
" 9.71811568e-01, 9.93838464e-01, 9.99874128e-01,\n",
" 9.89821442e-01, 9.63842159e-01, 9.22354294e-01,\n",
" 8.66025404e-01, 7.95761841e-01, 7.12694171e-01,\n",
" 6.18158986e-01, 5.13677392e-01, 4.00930535e-01,\n",
" 2.81732557e-01, 1.58001396e-01, 3.17279335e-02,\n",
" -9.50560433e-02, -2.20310533e-01, -3.42020143e-01,\n",
" -4.58226522e-01, -5.67059864e-01, -6.66769001e-01,\n",
" -7.55749574e-01, -8.32569855e-01, -8.95993774e-01,\n",
" -9.45000819e-01, -9.78802446e-01, -9.96854776e-01,\n",
" -9.98867339e-01, -9.84807753e-01, -9.54902241e-01,\n",
" -9.09631995e-01, -8.49725430e-01, -7.76146464e-01,\n",
" -6.90079011e-01, -5.92907929e-01, -4.86196736e-01,\n",
" -3.71662456e-01, -2.51147987e-01, -1.26592454e-01,\n",
" -4.89858720e-16])"
]
},
"execution_count": 97,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sine"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Masking: Index An Array With An Array Of Bools"
]
},
{
"cell_type": "code",
"execution_count": 98,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([ 0.12659245, 0.25114799, 0.37166246, 0.48619674, 0.59290793,\n",
" 0.69007901, 0.77614646, 0.84972543, 0.909632 , 0.95490224,\n",
" 0.98480775, 0.99886734, 0.99685478, 0.97880245, 0.94500082,\n",
" 0.89599377, 0.83256985, 0.75574957, 0.666769 , 0.56705986,\n",
" 0.45822652, 0.34202014, 0.22031053, 0.09505604, 0.06342392,\n",
" 0.18925124, 0.31203345, 0.42979491, 0.54064082, 0.64278761,\n",
" 0.73459171, 0.81457595, 0.88145336, 0.93414786, 0.97181157,\n",
" 0.99383846, 0.99987413, 0.98982144, 0.96384216, 0.92235429,\n",
" 0.8660254 , 0.79576184, 0.71269417, 0.61815899, 0.51367739,\n",
" 0.40093054, 0.28173256, 0.1580014 , 0.03172793])"
]
},
"execution_count": 98,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sine[positive]"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Ellipsis: Filling In For Missing Indices"
]
},
{
"cell_type": "code",
"execution_count": 99,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"array([ 99100, 99200, 99300, 99400, 99500, 99600, 99700, 99800,\n",
" 99900, 100000])"
]
},
"execution_count": 99,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"linear = np.linspace(1,100000,100000, dtype=np.int)\n",
"linear5 = linear.reshape((10,10,10,10,10))\n",
"linear5[9, 9, ... , 9, 9]"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Linear algebra"
]
},
{
"cell_type": "code",
"execution_count": 100,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"28.274333882308138"
]
},
"execution_count": 100,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"arr1 = np.logspace(0, 1, 9, base=np.pi)\n",
"arr2 = arr1[::-1]\n",
"np.dot(arr1, arr2)"
]
},
{
"cell_type": "code",
"execution_count": 101,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 4.10378921, 6.30400063, 9.68383654],\n",
" [ 6.30400063, 9.68383654, 14.87574252],\n",
" [ 9.68383654, 14.87574252, 22.85124438]])"
]
},
"execution_count": 101,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"arr1 = np.logspace(0, 1, 9, base=np.pi)\n",
"arr1 = arr1.reshape((3,3))\n",
"np.dot(arr1, arr1.T)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# More\n",
"\n",
"* cross\n",
"* vdot\n",
"* inner\n",
"* outer\n",
"* matmul\n",
"* tensordot\n",
"* einsum\n",
"* kron"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# numpy.linalg: Decompositions\n",
"\n",
"* matrix_power\n",
"* cholesky\n",
"* qr\n",
"* svd"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# numpy.linalg: Eigenvalues And Eigenvectors\n",
"\n",
"* eig\n",
"* eigh \n",
"* eigvals\n",
"* eigvalsh"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# numpy.linalg: Norms, Determinants, Conditions, Ranks\n",
"\n",
"* norm\n",
"* cond\n",
"* det\n",
"* matrix_rank\n",
"* slogdet\n",
"* trace"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# numpy.linalg: Equation Solutions\n",
"\n",
"* solve\n",
"* tensorsolve\n",
"* lstsq\n",
"* inv\n",
"* pinv\n",
"* tensorinv"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# Other Numpy Subpackages\n",
"\n",
"* Fourier and other transforms\n",
"* Financial functions\n",
"* Statistical functions\n",
"* Grid functions\n",
"* Masking functions\n",
"* Set functions\n",
"* Sorting and searching"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"# numpy.org: From The Tutorial"
]
},
{
"cell_type": "code",
"execution_count": 102,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAQ4AAAEACAYAAABCu5jVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXd8W9X5h5+jYdny3ju2E9tx9k4gCSRh703YpWWUUihQ\nxq+lQKEFWiibUmjLXiGsAoGEkIQRSEIgezl2POIM2/HeU+P+/jhSLMuyrekR6/l8FI1c3Xsk6773\nnHd8X6EoCn78+PHjCqrBHoAfP36GH37D4cePH5fxGw4/fvy4jN9w+PHjx2X8hsOPHz8u4zccfvz4\ncRmfGQ4hxBlCiDwhxD4hxB98dRw/fvwMPMIXeRxCCBWwDzgZKAM2AZcripLn9YP58eNnwPHVjGM2\nUKAoygFFUQzAUuB8Hx3Ljx8/A4yvDEcycMjm+WHLa378+DkG8DtH/fjx4zIaH+23FBhl8zzF8tpR\nhBD+Ihk/fgYRRVGEu+/1leHYBGQKIdKAcuBy4Iqemy0AFvpoCI74bgCPN5DH8h/PfzxX+YtH7/aJ\n4VAUxSSEuBVYhVwOvaooyl5fHMuPHz8Dj69mHCiKshIY66v9+/HjZ/AYZOdo+jF8vIE8lv94/uMN\nLD6bcThH+jF8vIE81kAcT2v3PKuPbacAaqR7q9yFYxj6+L90F/bjDY7143nGIBsOP0OTqQ5e07mx\nn0TLzVk6AftgWxHQ5Max/fgSv+EYkejpno8XNVgDsSPAwWvj7Z43ACbL4w7goE9H5McxfsNxzGO9\n4qcw6C4trxBu99z6+RosN4AqwDhgIxqJ+A3HMUUAckmhAnIGeSwDTThdRsWae1hHl4/Fv9zxJn7D\nMayxJv7NQDoj/XQn0nKz5WfLvT9x2RP8hmNYkoWcWQQP9kCGIbORRqMVWQVRN7jDGab4DcewIQO5\nFIkY7IEcAwik0c22PK+03O8fnOEMQ/yGY8gSCIQi4/vHglNzKBNnc19nuVUN3nCGAX7DMeQIQkZA\nhkqIdKRh9YuMtjzfCbQN3nCGKH7DMWQIQ06d/U7OocVkZN5IG7BnkMcydPAbjkFnHNJo+Bm6qIEQ\nYA7QCPgLvf2GY1AIRq6n4/rbcIQSAkTbPE/xYF+HbR4f8GA/VsKQBqQdqMZOn2rE4DccA0oYkETP\n7MeRjtWfMxr3amL6IsXBYxNShL8FmbbuDoGW/aVY9jWywrp+wzEgaIHpgz2IIYRAfifZuGxEVZak\nt0AthAU63qamBUxmMPeW5KVGLhGt/GwZU6drYzmKNay7lb4rfI8d/IbD50zF+1fR4cxM5EnqqKCt\nH2JDpOFIFd2DTjvttou2JMaZzFDV7MSOZ1vuO5BtgMpcHxsgLw6dQCHHeoq733D4hAAgDX9I1cpY\nZOKamz+3QA1E6GU6y03ATKNsvrHXsr8AZPW9/WpBrYKEMGg3QHMHGM39HEiHTLRLBuqBAjcGG4Cs\n6G1D+kDcNUJDG7/h8CrhSIen32BI52YCHme6xgSDxhKing6EwFnzllHSkk6uWS7/Qi+pQ5tnoPaF\nOKhwsI9ArbzVtIDB5GADewLocl6X4J4DNAhIRaa3H3vVuh61gBRClCBrmc2AQVGU2UKISOB95CW3\nBFisKEqDg/cq8KDbxx56hNJTO2IkEob8HjzMR9GqIUoPQnTtNhuYAKTBr695jnSxn5W607ntlme5\n5NQVsEENecAO5C/SEZ0mqG1xY0C7kKFYdymje4+yweYvHrVH8NRwFAMzFEWps3ntcaBGUZR/WJpN\nRyqK8kcH7z1GDEcEfk1mkH6Lud7ZVZAWwoO6vxZOl1rhTOBkI1PmbeLb1pPIacujcn0abAc2W7Y5\ngFwpOPp5mxWodNcHsaGXnTrLzx6+31t4Zjg8LYIQDvZxPvCm5fGbwAUeHmMIMxG/0VAhHcBeMhoh\nup5GA7pLnNYBNRryK3PQrlARRCvE2i0F0pBqA+PpORFUCbkEcou5QLyb7wXpiJ3kwfuHBp76OBRg\ntRDCBPxHUZRXgHhFUSoAFEU5IoQ4BrOcrI5PNyIDxxRjkH4MLxLoxE/SYiNGhR2gYUYIM2K20BGk\n40jTKDBq5MzDit5yPxOZtlGDLIbVWJZCta1uDDIT6b/Y3N+GvaBHJpHlI52www9PZxzzFEWZDpwF\n3CKEOIGe87ChMC/zEoFIj3sCI9toRADz8LrRiA3pcoT2x0EobUzhw9Hnc/tL1/Nm1a+YN/s7iEWq\nCTqKgAcjHazTkS6YAI30pbiFDvkdeJLVOpbhOvvwaMahKEq55b5KCPEpch5WIYSIVxSlQgiRQJfY\ngQO+s3mcztCWiA9CFjyNZPTI78DLhXgCiO+jXsf+V1oGjAUFQT0RFN3ZScbz3xO9t5rQSyppSouT\nTtJ2B/uKhv/ceA033fQWrBEy56OqWeZ8uEWa5QNU4F4CmXX24evs0xLLzTu4bTiEEHpApShKsxAi\nGDgN2ZByGfBL4HHgWuCz3vey0N3DDzAT8attxdF3LxUP6O+qb7/YTZJ3aeYD5Cj5nP62Hn1MK3oe\n5cXwWxgdUkpnTqCMrNgmh8VD8ORGslUFMnG0CpnsGRMsnaVuz41HIZcuG9zdATJkVIT06PqCdLpf\nmNd6tDdPlirxwDohxDZgI/C5oiirkAbjVCFEPnAy8JhHIxxUgpG/sJFuNGbhM6MRpIUoN75fI+zb\nPZEnlHs49ZKV/Hnhn5n+6908EXw32olNkN0JOZ1wgUH6bhd3wmkdnDB3DaEF7eTcuEMapMnIkG9f\nMx6nEMBxeHZKjQGmeTiOgcHtGYeiKPtx0LlHUZRa4BRPBjU0CKN7PcNIJJ3u/Ve8jKOwqyNC7Z7H\nAhowdWrZWjqT0OAGRkUd5BNzKL944HUqb49jTYr8CepUHeS/NpWHz78b3Zp9nPXFRv7yu8eJ+MM6\nYGpXrlclciwNnoj2qIHjgS04Xic5QwDSCVPF0Mr76I4/c9QhI31pEsSAFOXpnXQw2xqOCTaPjQIU\naGoLp8yQROIJyRS/kccfb/4bATEdNJnDmCx2kn+CgYsvepKv9mooXnUqn++6EKICutQB45GGI8jS\n5tIj4wEyDrwV95XDtMj1mJmhWrbvNxw9mMnIVuEaoEreuNCuSte+sF0hBSJtmi3bAmFmO/vbM/j2\n2rM482IVmxNyuapmCSE/NrLhgl1kboZnLrmdIvMYXqw4A/YGdK+mt7aiMSONh0pAnTthWlumAz/h\nWap5CvK3WObhfryP33B0wxqnG6lMoyvxwYdoVM4ZDXsm2jxO6v5f0aG17GQK6mAzt+wq4JWU9dz6\nG6B0Kvd0XssGjmfPkYmYt+llxMXRvq2OVJ23TotZwI8e7iMROSXa5PlwvIhfPhuQi9w59OzIPlII\nR64BBsBoBKghJsS5bTPokuuwT9B1cG4rqOgQAXTEBzIjFDY/NI3Pgs9lXeQ8yhsTMStqubxxOC67\n5/FOzoj6RIX0eXia86NCGqGhkzvkNxzEIn+hI5UI5OV2APq1BKidj6Bo6GrClkR3P0eqzeNp7aRG\nHyCIVrR0Mr9zPYd/3YReDe0rj2CyzCDbOvXQZGcI0u3HZ/NYCLmcCvbWSe+pUVYhZ4ROOJMHgBFu\nOMLpksEficygu7fRh2hUroVdw5G/ziC6L0uC6JIjjTYSFNRKUmAZp5Us4zh+ZMHm9Xz9AfxYBKFb\n2tDTSg55pMfsh0bLMtR2GGk2jx0JioUGQoQ3TtZpvRzAVSbTpTg2eIxgH8dIr2qdN3CHUgnnlycg\nJ4HWE9rWrmmAHEuW1owOArVtnBn6OWeaVjEqawknVoNqPQSp4bhkGLVYIVspgA4T7Vode5InQblG\nOlzzkUGPWLo0jLNxXH4SqIUYFVS7U45vSwpSHcxTIpGp6ru8sC/3GKGGI46RuzxJwKe5GY6Is0/E\n6IMkumYYOZb7aGC0GbIMEKiACkIDGxkfvYfHN/2arxZ3kiugbTxsswhufVEC037bwKILl1N4RydZ\n9Q8SoZ9PvXXnY5EdHxuQeVdF/YxLo5bp6Y3tTooBOSIe6XzPd/P9tugZTOMxAg1HAt3npyOJRAZ0\naabTgN4Fh7Ot0RiN7JIwHog1cUf2E8xO2sjfuRcjWoJoZQxFbJh1Hr9YtYyiazr59Kfuu9v7LXTs\n6GRKJoQUL+WrKechjoe6w7FwSCuvHdXISKdAppyHI42JI7QW41HXCh3uhkdjkCrr3ph56JEW0BuG\nyDVGmI8jhpFrNGIZUKMRoIZIPeicMBxa5CTQajQCkcOdDCQZiZleirq2jLGLP+P/ch9mLuuZxjbC\nqSeCemiih9EAS+cTBc79EPInHU8qB0mIO0JERjWqWS0Eza3hlDM+h0yT/GlgOW5/ROq7BJHdIh7v\nRUgiGAyfxwiacUQi56QjDQ0y1DyQh3TBERpEdz+GFpgCqhM7mRn1OWJiFBccfpdxxq1M0sCouuXo\nALViInnTLtKXlRIaCzNUsMVBgWsgYIyGnI597AraTyjNjI/cw4Sqn9Ela7ms4UMWnPstpQczpVZH\nBPKc7q/QVauWQshuzz5mIdXAvNFOIRI5Ncv1wr6cY4QYjhhGptEA+QMdQNQqiHbSEZpJzyiwpV/V\nU7+MIKesjdCTNXz9lZGJAp41w+/Phumzt5J6pJzq6+ClPaBV9S5g3tEOuo+h4tENnFuhYwPHo8XI\n3T++TOFjHVRumUJpmSW+G4KUFU3DeYHzSD0oClS4I0WYgPfqUUKRkZttXtpf33ikOerRgQdMczQR\nWfY8EhngpKFIvXNZl9nI37l9flU60sZPUoheVMrDYfcT+90WRs1UEfvlTt66AkalwehOEGHwjZNL\n+2QBpQr87nMtuedMZkxFLv9NaONXOxK5b/JfeLfwF7BH112ztB7X3BAms5x5NLpa3HYY77SmtLIT\n52pkPNMcPcZnHAmMTKORhlxHD2AmbHRw/7oayUg77ohUuvwMakHN/njuH/MoZ5y8gnQOsHhMHQqH\nOHDAcpqVOz+0Usu1sejvBkJWbiExHaI1cOicck4+819MvDiP+9T/wIy6y9cYgfwanT2n1SpZtKco\n0GpwQRgoxoWDOMNkYDdSJ9F3HMOGI5qR6QgdhWdydi6i08hWjOpe/OwapEJBX37ZJLr0f625VlVq\nauOj2RY+Ax2dNJohOwL2eSDRuWIDsEEqS2WEQfraWMSrZRz6ohjlNMvFNxSZINaCdJQ24JosaLBO\n3pz2fQQifVAOvLtuMxEZpvW0UK93jtGoikAuoEca6XTPx/YhAiksHKl3bDS0yELjqfRtNFLonhlq\nnXW0q2TUEgigg9rZ47h4Ys/VjbuENML3qfO475E3efAP79Ft1m4rw5KJeyk/kXp5cwqrdfUmk/Dl\nvOAYNRzDQ0XJu2QzoIldsaGyLaM9OuRseYoT+8jAKb3jqwzv0XLed6jP916lRtTXo9ismUmlbasD\n20CQbaQnGvcinjqNFGDubTbWDV+IFk/DV6f4MWg4JjOyqlwDkL0+nElA8ALhgTIMaV85Gou8Uk/C\nOX9sBl01J7ZYXwuQGaKjOEDdI+Xs/6KTDx/1zuT7oRNg8sQaxtXnkUgZtAkwi+7+lyC6l5aEIWdQ\nrgbn1CppPAKckWvwdicRFb6aeR9jhiOKoVI9ODDokZETb03g+yA4QBqMIDurEI+cXaThnGhaEHJ5\n4sho5Ng8jjOCgLM+eJqq/5RiAPK91ILk643wWnILp//iHRYZv+36jxC6F7FOpOfPKRJpQOJx7TyP\nCnYityUL71cpR+KL8op+DYcQ4lUhRIUQYqfNa5FCiFVCiHwhxFdCiHCb/7tXCFEghNgrhDjN6yPu\nlRB8Jqg7JAlkQJZkGhVEBskqUVsCkCdPKs5N8PTIi98EHC9PQum6wmsVSDCRnZhH3uILWPD3RK5+\n01GjFPf4wQDhOvhfTjbfahZZzgJL6CWb7jONCTju0ZKK9EPPRK4QQyy3vnBKi6S3sJMnxOHtsLwz\nM47XgdPtXvsjsEZRlLHAN8C9AEKI8cBi5KT1TOBFIcQAXA6h++XqWGcasiTexySEyR+6fdp4NnJF\n2JcfVtjcZiITG3u7mIbRtQQQCkzpQKdpR60yU0E8n//qPMxZ3pvGBwAXfS/o/MeplJOE0Jm6+xFz\n6D6Jm0Tfk7pEy3tykJ/VerP9DqxoVPJ77ZWofg7mLtO8ut9+3a6KoqwTQtjHNc8HFlgev4nsrPRH\n4DxgqaIoRqBECFGAbNLkzViTA3zQJGjIMhWfK3X1lpOhQ57geqRPoy+3ig7n/iRj6VoOjOmESJn/\nkBx1GAAzKvLJZlzDCicH3z/hKjAc1pI/XcoqpMftZ//UMVKLtMVyLZ2MLHaxJplNQyaIudK3yda2\ntyL7LVnzT2JCoLq5lzdOoXsfS2+RjbcK4tyN18T10h82me4ii6X43NUfy8jxa4zHZ+rrKiEbPvem\nPB6CvKKmIpfNtpslIH9JMWbGTdzF3qbxsEvbvd7jCLIKNZguZa8YINwEEWaI7SpVT4spQaeVb1Zj\nJoRmIhICuP9heOYBz1Ob5i2CfSfKZV4iZRxWpyAwo4zrhCo1HNDKi3MQ0k4fQJ7003E9o1TQ1a+p\nGak7vAc4oJIGusbRpwlGWl13y/d7w9Wstt7xVqB3kPrDhjIyFLwi8JlSl1YtS9/tnZ62jEV+1SnA\n5SaC9U1kGovY0Ta1S1UrxsgpY7/kxNnXUrHvXt4qXUyT0WaiGmO3z2gTwWn1aEO6V5OF6+vR69pQ\nYSKbfQTTTAT1lE/NpCOhiLGPwNYO3CYzEeKWR7JPF4ueViKpp1kVQk5yHgXlWRhj6WbExugLCGru\nYHf+NNhr+awzkd0UFWRhnCNi6JImzIGTa/7Omb87zN2v/ku+ZgIOq/swHschBYrdaSvZF/10ZXUS\ndw1Hb/1hS+m+8k2hz8YQ39k8Tsf13rFebno8JLEvH/USGpXMw9D04+aaiHQWJkHWufv407wHmFC4\nh5/GzuHuiqcIFi2Mq11He04SpylfcV1oHeolD1N7VRQfVF6GaZfdsmpCJwIzlyR+wNg966hOGU/W\nklUcuGIhZaokCskkgnqSKCOd/QTQSToHCVTaUevhvBfgyG+gzI2LcbAGrv4d7NZGoqODNA6iwoyO\ndkJpIiixldLmZOpbIlGpzKTHlnARHzP7zL/xx3Wb2ctUaFFLlfR0y077C1jo5feXe+1lPLzlMhb9\nbjk/LD8NY7VWehgPqqXQUaWjIrlIZE9ab7CT7v0wPcNZw2Hv4umtP+wy4F0hxDPIJUomsna4Fxa6\nMlY7RkLTpCC8HjkJDpBLEmd81tPpcp8nQYEmk/zEVVz7Sj07puXxZCvUKpFEnvgUY/PmEzVhA6/s\nhZQLF1GgziIyuI7qCT1/YtlJ+YwWxWRe8ioBhwSaDoVHLviap4PvIJt8El5fwy8Xb0W3G3bMGYtA\nYXzrXnS7gUK4Mg6edKFWxcotyUAyjGkrZjT7EcEKcZZr3sH4z5jy7lxWn3Lj0ehIBsVc0bGUIhUs\ne+JSXnmmnseXVkGOumdf2t6wSRyriIrl1V/+luxLC+Ux4oCDyDNLrXJQ35KJ9wzHZLo3TV/i0d76\nNRxCiCXIMzxaCHEQWdL6GPChEOI65IJpMYCiKLlCiA+QwgAG4LeKT8pvVXhH+HUo4+UeJxFBEKBx\nXvJ/PF1Gw7riaFPxys5dHE5YwfUX38RO8Rp3PhbEmwcheN468lvg0ne0fBsSzFjy0YQZ0etaOFid\nDsComBKCda1kk89V7UvY3gGmNoVa4IU4I2eXf4k+sIXvny7jqetknccD/9jD28/AniZQEoAqaHEz\nC2zpEVDdC9pH4YrJCjVr1nDlXzSUpWp4s9JA06lrubuimY/iLmA8eznxlv/x1ZJ2Wuph37b9nPRJ\nKq9MLqMmLwlq1NL/0YI0IvbSg2OQyzuVjBLdHfwEx236gXvfeBxlrSLn4rnIDIICIZPEaluh076+\nJZWh2ApymJbVD7AwzYAzFa/MpnQa6ex0tcGQ1adhZTzShiUBp7czJqmQWzXPc8WGl9l+IvxokpPq\ns86BxBd0/Jg2E5NBTcF3WnYeyqDguouO7iqQdhZWrsCQ+gomm+V7sgoWPwChWfDPq6UvEmRwxgOX\nhlNMi4VtlnaQo5NhfnECLRtDOPJaIflvSRUxgOufiuKhS/7Ka+rroVwNpX0ksCQbQKcgoozMSdjI\nkzdcxM51DdTuvJP71zwJu4XUPC2nq5S/wwB1jkri13vvwx7lrJFWVh/e/ybDllg8loFTCZlo5KiO\nxBmsRsIW6/NaeXdx6/9IaSnno/lQZTmp6oDGlWC8oIMTnl/Ph7dD9A649ZFwPvyigfJzTsSEihBa\nGBNXzgXbVCw93UyRjLpSaoZn/gIXRnYZDfC90YAuowGgDwTNc0fY/n/dJxEBWlj/SS3qk0pJyj5M\nGSmQ2OVoiQqsodNBJlxq9CHiqET731Su+HMD//jjBlSXGjGP18qVaCNdOqc6LWg6HKgShQLuCAX5\njmFmOFQcu4leMXhkNFTCNTVxR0yjZ+6FnV82OymPxee+QnXHIdoj4Zar4D+vQHkbfG4EtsPkE6FD\nwGEFiv7UwMkZH1N3ThM7mUSMUk2OIR9VjUKJA7f5J3U9XxtIdhfB7v/r+XqwEcauyGZ/aAtZFBCu\nbzz6fypM3Pr2b6l5NI+xG09k308avp17DRWhqWRTwGgKOdIST/ma3SibTmEaG9lTPpELTvqUpZpf\nSaNhTduICYEjjXZHT0NqbAwdhpnh8EU67lBgJo7zmp0g1uLJc6oCsw+m0H/C1hjIVIpYYYCT3spk\nVmchHSEgPqCb6NRO6BagXzjFzB5zAdMN26h7qorVz5pJFpCiggPeTlXwEXUKjGotJjO0iHp+Ygsz\nKLOkKGWzj9jFsVy2eTNvp6xAHQgP3FHEivsvQoWZTAqZs38roSaY3fYC/7f3n5hNKra+38nS86+C\n5Xah8Ei9XdProTfLHmaGYwAFagYMN+T9QnXSUAR6qQp4HI7rTVR0H5oWVpSfzZE18RSzkxlsZr5h\nPYaAfb3u2gQ8/Bnc/lwRocmw4j45O3/eOyMfMGK1EPZvI4Zty4ndt5qrc89nG9YksiNktxXx1Y9Q\n1wKz22FWcgFhLz9J7vI25l0WSqypiU93gHp+PaF/msU3p53Gkt9cDZ86+Ns7dGB7W+zHM4aR4TjW\nuq6l41JSrVYtfRf2xWaeMo7e/bCCrllIVNfLxXVjCIlsJquxkNEv7CM9HJ7tw/GvKHDwH1CjeCP1\naHCoMsCjD1mfdXLt82vQ3GYmgjpSn9vAx3e0k4CcaP1kgp+u6+T4WNhXBaFfNPG6CeKjYNRB2JPb\nwjcXL2L/3kwZldEgg4RWuVKtuqvPy1E0SKeIM3qivmeYGI4QBqQp8oAQiNMFagLZQSwssH89T3eY\nRN8rJNsUEhvp1vrWSIiEiNBanr6v/8MowMdH3BviUKWpsY7ZDZtI6iin/mPZ4sD+I/5ocbpuMcF4\nAed9qqY6J5Lto/Yy68T/Ud0eSUHDdMcHiA9z4OsIwW84XOJYcYi6kJsRpIVwH9bgzOzn/20LOI8a\nje6h+5PWfMNSLw5pOPHWA3D/lwfRTIcnf+h/+zwFSt8bRfWLV6C0Cc5VvuX5ZZNdLNbIBqr63Wog\nGAZCPkEM/8rXUJyqahXI2oWEMN8aDWdU6mzroa3LlECl25/i20UnAXDZSJJBseHRDfDSa85te/vL\nYHrxTJZzDs9W3cmpP66VDbD7KphzqBrmbZUw9xgGhmNy/5sMacYgP0MfCV1hgVIsJz7MN0sSW8bR\nfwAn3LKNQGb2W0mSWY2ZCdIZulszkTnmBaR9N0wmrl5GASqczGJVTdQz5ssSEkxHaCsMhVxN9wr3\nJAdvCnbkNPcbDicYIB1Nr6NGymPNo9dCPIFcjiSEWbI7fayTGo3MyXAmITWLo60Yjy5m0zuJSKlh\nbNJeItT1xFKNBiN1IhJDhIqHfgfTPUwjOZZ5b24rGZ+sIPqBz6BaI5td2xbFRjl4k8PfRDjd03oH\nhyF+qRjALmReQ0+fhWkqIQ1FiPek8PolAudlJ63upDAABYIUYqaUMjF+F2pM1BBNGgfR0c5opZiU\nXdvQl3XSeMDNLogjhNoA+CRpHmtvux9+EI5TYp2W4IhjsDNJh7jhGG55G8fRpz8mOliWsQ+UmiLI\nmYazRmMKcqYRD4w1QaaB9PhiXlBuZbN+LboJobRsuhkzKsaRR3Hwp3zTZqZWDTtMgybKMuT55TrY\n/0o4f7jnUUrLbVQnEunekS4SOROxJTgAWuw1OeLpWVU3sAxhw+F9ZWbfEILMyegju8/ZnqreZjLO\nTdrCkWtsrbwPn1HDGROW0aQL5baHX+K47J/Z1Gbm7jsa+Un5iv1iNDMNmxnTaeYrYPswyf4caJLG\nwQnPqPlk5g0sn3c2h1osRsOqGOi2o2AALzy9MIQNx9BwAvVOGnI+34fwbIiua0ki6O4A60PeyCN0\nyK8uvr8NLUTQvfVGHJxa9x/Ojr2PeTdFUfxFLc/kSdeI6huFzpXbiI3YRvaZsCyKoRIdHHJclgzZ\nS+HLyQvYxCxabSNqtkLnWUCB5XE6PWccvTIV3+iSOscQNRy+6GrlDaKQZ2YfcoUqIVPBwwLl2RaP\nY8eXbdlNreWmIAue3KGvYzkiApmfYZ2RqJARlKxOvku5mrMrd1AV+gHrLPIQLcBfbUKPie/Ddr/R\n6JX3S+GyP0Pma8VkRRVQY99IRoPUYLWfqNpLgmp6W/oGI/9orqgne48hajgGfyrWRQDyjJ7d/6bh\nQTJSAjAPxBwzSqsKdiBljXojip4n/A6bx47ea3W4B+J8Nr4a+Vtz1J7RLupt+rGUH8I4Wkpvz//8\nRqNf3v8MNBkHGbdvCydo1vCe+lpe49eAAhOFrAY0I33p2yxvsl++BGmhobds0cE7T4ag4VAzNFTL\nkyw3J6IfAlkOrVZJA5AFXAnvjrmcKxuWwChLzH6PC4e3Pbkd6dW6EnDSIY2LBsfragfZ/JsXXsSN\ne8tZFl/MWBXkD86FbdhzvcHM/8asocgEF5WEsyblNA7uzZYGYwKyqbwa+ffegXRm73d279PoUgEa\nWIag4XDFN9MOAAAgAElEQVS1Oac3sV667SW5+yBKLyX5rIxGzgZ2wdbzJ3C3+W8UpOWwbNZ5qHNV\nGD8NcD2S5mpU2vYrjOx1K0k03eWl9dJC5IrxrIk8nYsOfMn+c0rkD9yPy/zHZrLw0/01BP6nDTG9\nDWVPILSppKvC2tqyE9iLC2qBAxjSt2OIGQ4d/f/SvYnVYxmNy0k1gZqeKlvjuj99Mv9ezhr/Gfcf\n+Af/l/kEpy5YibEtWkrrG+hZFeUqfXVSc4YoB/vQgj6gjVb0tGhD2TlqBiFjS/yGw0MyUyHp5hB2\nqvaiTjZRqM7CYJJXBJUwcf975/JR/NPklk51sY4tgi7LM3A4I1b8KnAOUKEoymTLaw8CN9JVJf0n\nRVFWWv7vXuA6pOvndkVRVjk/nIEQIA7DtbCDHQKptGWfi6GnZ1ZmQQA/xx3Hz7rRaOKDMVerupKx\n9uP8iR8ohxw4oYmYzhoO16VBvpDfsLvaeqF0q3gFYFo7Ok07wYEtTGMr0dSQSQEz74MJhfDu4Dnx\nhz3HjYPCqWqmsY3wdXsInX8KR1oSaDaGMCa8iPl3dVJX/j9yq6a6GKnSMxiGo1+xYiHEfGTk+S07\nw9GkKMrTdtuOQ+quz0Jmb60BshwpnTsWK/aVCLFAfsFTPdtNXxWrE+jumrG0dx2Xs4Nl/5rK6IsF\nkyK2kFsylaNOrV30nyk4CbkGTjJwQ/B/ic8p45nqO2n90eKlb0f2+XCFMHoGhgLNMLGTccl7WMBa\n4sVdBAXDH76Ezx6Dbd7rwDhiuTU/nMr0SD6PLiEhHH469ARVIo5LKz+gKmk5M7MCOO6eDvgE2EpX\nwKRHeb097ogZ+1isuJfeseDYpXs+g9I7tjdykJdrLyiG99ZPFXr3544yEJlZRfn9s/k5Lgkt7RDW\nATstM6tJyGmpo3ae4ciQreWQEenVJMSWct+av6PKqOHh8c9Brq4rqnII2Z+0P2x7tdqSaSAtZj8L\n+Y4xL33ELA1sbYXma8A4XNV3hhjh1zfw4f4GQlphfzMs/PdzxN+cyKzHN7FzVTLnTlsvjcYwwBMf\nx61CiGuQbt27FEVpwKPesd5qMRuJPOO86CuJC+27H0kvpSk3Zf+LC3d8RvpPe9h282Q0GBiVVMLB\ngHS5zKizWIUEFRTZGKUQulZtqQYiU6vY2Daf1Un7Wf63FA6eMoVRHfs5KDKgVi3Ls7ORhqMVOGw3\nEGvmfm8+37EdaPSdTAvYzi9n3822I/CNJX/jSc/bjPqx8Oi67s+Dnj/M/LrD/P0ZuOB6OCfyCypS\nUlnBebIZljVg0kOD1J6B773iruF4EfiroiiKEOIR4CngBu8Nyx1ikWeIF5sYuSumEwhMhSZDCG9P\nv4J7qoq4YforHFmVyHcxCxAxUNscRZMmjGBdM4ljyzh53jcsbbqchraesdGE2CMc+krN1HlQ88sc\n9LSQrCulKjyOtiA9JBvhiBraBXQKiHGiNF8oEG2CdGkhshILAIWSM5Iof7jM9c/sx2W25MEWi4La\nnltKCRzzCTGLrnFjTwPf0dAtw6Eoiq375mXgc8tjD3rHnol7RW39VKO6S1hg753bu23n4DXLbGFJ\nybXEjDpCyoJSHo1/mDHBBbSgp023m4kBu9nCDFpECKd2rmZRyTo2Zs2hqGYMze1ypwIz2Yn5soeq\nOpC8rXDOO2uInpSHbspvyAwr4tP6C+gk4OhXlxOax/6mDJqMoTLk54gJ3RNDYkK71iJ1fz2Z0zqX\n8POLJur91a4+Jz0YyjuhqimSwj/fzurPz3VjL9H9bzIUescKIRIURbEGEy+iq+mDB71j3RHs6aca\n1V0igjxTEM9EfiNqLdWGBCIffpVPPjiL6y5dyk7dh3z2pcJlExWu+vwNfoqZT7xSwaYb9jNmbRGj\no4vJNY+X+xGQI/LQYGLzguP49erdmJfC6msO8+Tbf+aFDaNoeVGPguAQqUxjGzNWfUzRaSexTDmf\nfPv4sAMSwsuJDKkjgA5UFm9cxm8jmdlczd/+5f5X4Kd/TpgGmg3Tuer5rVyy+CW+WX+azOPwCUOj\nd+wiIcRUpN+3BLgJPOkd66qC+UR80mtCLWQGqCtl7/Y9lKx+BOunLtPy9NvryQgp5uDnqaQ3l3Bq\neRENfy3g8wQj1935HSXfg9ICt/MccQV1bC3Q891Z11NruZKkcoAIbROHR6WSoTuEVgUPX2NmUlIJ\nf7v4IV4++VpO4AcmZ77N6BNa2RtUzr4TxmKI01LfGklts+MrUmJEKRHBsjhGoDCWPIz3/MCX/6lm\nlL/i1aekAk0BsKr5ai659lNqchNRij1xOdoXufgWZ6IqVzp4+fU+tv878HdPBtU74XTXsvMiWhVE\nh/S/XX+k93ypsjme6PAaPuISskL3cWboSlQNBcxIhn8/LVMxxoTC3A828587YcGbwbTyMy3oiaUK\nBRWxVJH57SHMO0BtllZ5VxnELSvhjIUrSTEf5qf2VkwHISktgDAaydQWUh8ewX6VkerGWBRLvnls\nWAUxoTVHxxdIGxPZTdyDn9D8USlVTbKJuh/vo9fAnW/Cj5fP4BnV71lTewpNBdHQqLE4zN3d88D6\nOYZI5qgzrQ+m0L0e2Yto3DQa9jqR9kFrA0eL0fLKcshK2EeSKpQNzOWsf6whdFsr5tvg+xooaoJH\nLpPbrjqlhV/WfEajNoQlCRXcvQnUbfDe6VBoN3/btdTEDYs3oOmAnLPg5ZdhQ1out+18kHcm3UY9\nEcwN3cCG0Lk0OXDIhNJIKofJYh8JP+0jr8S+W7ofb9JqhL2rYd+iFKoTY2hqC4dKTdcSpb+UjV7x\nsfSkHUNccxSka+U4fGY0VJbliVvvtXmsoadEqk3qsKKoMJo01BFBJwF8lz0XUmB9DT1oBH48u4X0\nf1VAJ/xtAtRdAFkO3DmNlfDYfGj5Dfz75S5P9IHJFVzf+To33nILsRMf4wy+ZAK7GU9ut1sqh4my\niECMWTmWPzuaX/rxKh+/AaZd8g+vEkaY2t6jXIGtru7VR+dHLwwBw9GXUzQG2QDER8rfgq7eq+5g\nq0PshJvmQHU68VSQSSHpDQd4YXHv25ZvhhcfBpNlAvDCYfjSwWSgHeloeq6ge+lLHjDpj4WsfhFu\n/F0nYygm86hiTBdxVBBPJTo6yW4t4OmP+v8cfjzj1smQOg+y2EdWYgGjkwpBN7zKj4fAUqW3kGcC\nPq2U1ajcn2lAdyGeTHpXAkjqEtNIiynhXMPnBC1eQcpUA3WVvcuwHDYi17xOYr+pAXjnOfn4lTs7\nuHjxemIjq9DTRrXF6RpMC2rM6Glh+oG1rLywk2ZHJfx+vEsemG/dwjlPhBES08y41l28HH8NW0PO\n9HDHtnJivmUIzDh6w4dGQ6v2zGhAV+g8gN5dNGFAiHRKxIRWEa+tYIN2LqmXhhJcDPN9rMVcaLFK\nHa2Q+MtyAhPXcvmWj5nCTtI4QAzVRFJLJkUkxTQTOxxF5YchL3TCpjfaCL99BTeufpaM6PeY8MK/\nu66hbbgp7OWs/JvnDLLh6K1Lm5O9Vd1Bo5J1J55gTQkPoPeVVjAQZEYb2c645FwywopJskhal185\nFZ6CUO3A9ah7ahmsPQJRJSVMNu8kjmriqCaFUsZQTJCxnY3eyw/y4wTfL4GG6yvJeEnH8r+92LdK\n3BBjCM445uHT8npPZxp6ZO2coHejEQRkQdqJ+WQn5BNCE6M4hMDMOPYizAq6rTD9FEgeYPW3HbdB\n3vG5TFB2M0HZTZZSQKShjuBl5XQOjX7GIwa1gNWHICOtg7g1jV2aJ8PA3TEEfBy2+HCmofYgemLF\nVhG8twp9a/VpTgf3Bz6C+t9byP3NFagws4jvmJO3GV17Jy9dAU21zhW0epPvyyBTC1N25NNp6fmq\nqoeABgjQQucwuuoNV64fD19Vw/y7RrPp9GSSK5+hqtqmsbrb2aMa5I/P91eAQTYcthWxkfh0phHr\nYds8a2MjLbIcPo7uw41AfpshZogzkp21FwyC9C/zia17lpzjIkhccpAnXjGzcAYYBsFoWDl4AL66\nFs68G6nLcQgqd/iNxkCxpRJ0FRfza9WNbD00k5bi6MFuzOYyg2w4bFOhe+mx6g3CPTBIMchErwDL\n43OM0rnqSAMlxni02hTgI+3F3PBsA1lPfcuuxSW8Y+mZ8d0W94fjDTqBLbsg5yXIOBNoAYMLOm1+\nPEMZDfWqCCKpo6UpFGqQgk7VDJs+NUPExzEen3mEI4IgyMVwQZDlNhOZQh6ADPKcY+TWV48nfnYJ\nQYlNEGSWt2AzzGw/ajR0mnbUKjMhtLAlYypHnpvOrF8MnCPUGYwKbPgROj4C05dQ76+kHzB2/Axn\nbFzOTTffLF8oRSbkeIWB6RAwRHwczqScu0Ffql322Fbm277F2ockDUiAg2/dzW1Z2VTXPcQK81nk\nl/esQE2P20+2RdZLhUKrWk/86RD5LlRXuPlZfEAB8MFOueraONiDGWEsnXeEaffP7VqiFFruPS4S\nGod7UoKuMQQMxzh80lgmSu/YaFi1fjT0r/kz3mabcKBaQ+C8NgxGuKzpQ34MPZ5xybm0dMiNmttD\niNDXM0YUobGIic4ybOKkhrUo34LJQXr5YFPEYLcvHllkAFM08KkRlmjnwL4Amb1nnXEMk87dQ8Bw\n+KA8Pjyoe6+TZLpnevaHo+0tNUT5jOX0pouZ86/3ufGqV1kRcSZmnaCWKDJ0+7ns249Yv+g4AGKo\nYs6Orey9uYNtmz0ofPRzzJD5Vx3fP3AN77TcRtHGCbCOwWwB6zaDbDj0eHXlr1VL1a4gbc/eqM4Q\ngYwy2Ht+rJGyGCN17VG8F3glU8/N5aQd3xM7v4IN6rkE00wqh+h85lvOWVRNAVkE0YZqYgdzToUv\nB6fhlp8hRuTuDq6b+Ar/t+wpKFB17xVcMlijcp1BNhxeLAVWCYtPA8e9UftCjYyY9NXnRK1AupGK\nhnimB27h7VGXMfe959mz8GseqPuWr80nMVv3M5FJYD60iynqXSgtoO2Euufc/lR+jiFCQ+DbZfBt\n5Vt0/BwCFbhUjzSUGGTD4UCUp7dq1fo2MDiQpQrUQGig7Ns6GdfbJYJ8X28THxUyX2Nyz85Hx58s\n28HqrzATt20NcRfC46/AwjdhQhC0nQBx06AmFcctEPyMKC5al8rt4X/hi/qLYbdlWut0n9ihxRDw\ncQDBluWFpo9li319SSrSSCQha0dsNWqc9faNsbyvt8MGAeMUmNJxdJvk8MOoMJNMGbrUNuao4aGV\n8v/W/lv6uFaaYGU7hCyDgM+hc5g4vPz4lqa1YXxzyXkom4Jk87XawR6R+wy+4dAHyBmDI4KQOWL2\nuWECGUMcDwvnfMN3hhPhe02XR3qm5f4IsnDIPgQaYtmvtfVKnOW+svtz7axWQrNqaWiNwGTWkBRS\nykXvPkTydVGEiSa0h0zMvgJ+ekdub58J2gzDxkvux7fkrJ/HpVNeoGVNdJfYuH1muNdSiePo+jH7\nBmfEilOAt5DNVs3Ay4qiPC+EiATeR2Y4lACLLU2ZnO8fG6SVbQgckYnj9I54unwREVA/PpAIQyX1\nOxKh3i6sm4FcatiUAajCDZgbtFK6wJ4UBfQKpBpITD7MwzzIS8E3HQ38TGU7ZyzYS9LnuYyeALkv\nwWfvOB6+Hz8AWg2IEzJ4bNaT7NsysXvJvL32yWDVILiBMzMOI3CnoijbhRAhwBYhxCrgV8AaRVH+\nIYT4A3Av8EchxHhgMTJBIwVYI4Rw2D/W6T6sVuzDpBmd6CNb+ZXyGqtuP509z82UCTWT7PNCpEFQ\njW9jfsA6vu9cAFt0NmnjCsSaIE16qlKjDzA6sJj5hu85QApFjKETHePYS+voRHLW5FJwD6j8CRB+\n+kIF8YYr+afyO3aWToUKu9NtCOb1OIszKudHsKjSKYrSLITYizQI5wMLLJu9ieyu9EfgPJztH2tp\nH8IBoMXy+FK6G41cy/08uiuIj+nk6ilvcKHxE6bNXs0d5/6Tyx54j7ymHOqrLTUwhVroVMHkDjJS\nijhf8ymZX/9A84Jg6s6MhFaLgypAAY1CpzEAjcrIeG0uozhA6ffw67mvsCroVOYe3ETtqFAKTssF\nAUv29ffN+RnJTLsB1t17B//iUvIqx8EBy6lWMqjD8hou+TiEEOnIgvKNQLyiKBUgjYsQwuopcL5/\nbAxwKrI/QIdJLhWyFOk0CoagsFYUk2BRxmo21swlXTlAbUAkUeHVjAkq4u7lz7Ll93t5swjYVsmZ\nD37J6MgiskQhGyLmkphVxmR2UfhDDB0ZcdxY/Caa98qoO+UTAmnHGKbhvM7P+Vp3EuUkseDN9UQ9\ntxbD5kk03X6EUUeOsOt2WDxnKZu2wJh0OLwN/jKMnVp+fMuZaZD1Iiw7azGVZNOmBGE02ZxmPYNz\nwxKnDYdlmfIR0mfRLISwX3q47gbc/ZBc85mA9BMgdUHX/9n0jhMoCGG5tzwHBRysfgQKKstQrNsK\nxfI+RTk6Srmvrhu226EcXYcqCmCWb1McH9KPn6OIo/90ezAE8G4LSOFMozUhhAb4AvhSUZTnLK/t\nBRYqilIhhEgAvlUUZZwQ4o+AoijK45btVgIPKoryk90+FU6yHNt2qbKY7joXvS1VMju5ZvLrXKj6\nhKmz1qA5N4rFf15KXnMO9VWWpUqRFjpUMLn96FJlzNfreH3BfdQRCW2WP6xWAQ10GgPQqo2M0+Qy\nSnWAxV8/y9i5LXwVdBrzDv5MzagwCk7awy/UBv6yxolv18+IZdqNsO7e37M641L2VoynszAYqjXy\n92x1itpnE/eWXdxh7KdbvT0F9B9VOQtFcaQN4RzOGo63gGpFUe60ee1xoFZRlMctztFIRVGsztF3\ngTnIJcpqoIdzVAihkNDLsZ11jp7YydxF33Oc8iOrxOnsfm4mNIlenaPqCa3M16xjrWEhbNWB2Tql\nUSCmp3P0P4abeFd7JcWMoQMdx7GRbPM+zvnv1+x7BtqK4FN/q0Q/vaGCFJPFOXp4KmwNlDNsazLg\nMDYczoRj5wFXAbuEENuQs/Y/AY8DHwghrkPOGRaDi/1jG9ocR1b24DgcW4pc1ljVwfcH0DpVz+uG\n66l7zyYcay0a0mOpO5ELENPOEH4IPxkatF0SgCCjK1UaqFFDsJlDKekYUzSsV05ghfbso5uF08DU\n4rXsTYDM5bDn78BrfX9/fkYwZqjQLuGyEzfCynfZGT8TSmxOuWiGbWTFqRmHTw4shAINMgGst1yO\nIKQDNd7+zZbXxsHCOV/znWFB9wQwK0eQweQjdq+HWPZrbRDdRwJYWFYt9UcTwA5z1Yd/IPn6aEJF\nExdtWobp+Vb+6c/l8NMPY9fN56GpL7BvzRTpajAjL4TlNhvl4jiXYwjOOAbfcIBzKef2WFPOk5Gt\nCAYo5XxMdCFTArdzPBu4tuIdtiQ3sdGyXNHT/e8eAgQImXLe7OSQ/By7XPj8BOZetJbWzVGwXcjo\nYbHNBiVg6cbZHZcNhzNCPj5eqgwILZ3yBs4XuVlnEZ4UuVkNzDQcG4825B/YHAjT2kENhxtSmBS4\nk1KS6TwUxEZTEw+dDj9th9kXwGOvwEItTAyEthNlkVvhUnjHX+Q24glb0MhJps9ZPn0xSolFIaq4\n7/cMVQbZcOymR4VslYvX5nYjtDfLsvqdoe6V1e+k97J6M7JybacOpnUPwm/4Rt63LlVRZVxEVdAm\n7lIaMd8HqEHdAsZOiH7CxfH4OSb5ZP4hzjD8Cl2Fho8nXgnrVLIsYhhWyA6y4fCiHr9ZgZoW6TPZ\n7KKQjwlZCNeBYyEfAJOAEg1xMypoIpSrD71P9JwAAo0n84j6eIJpoZZIIso/In7UpKNCPvPb1xF/\nexP83Xsf1c/wpLEJLr0Urp13DV98eh4dBWHdhXyGEYNsOFqRZ62XVMAMJhmpEUC9VpYug4zCONN9\noR7Y6mD7PGS+bLWGqMBarmQJMz7bxetXX8Fy9VmYsUgHsp/L76jmC44HIJYqzLt1/LymiXh6Fun6\nGXk0TNbx2gfXkNJygKLMCVBhc5VKx7GPYwgyyM7RFciClcj+NnedKH133VErKUhnqhrXxIonAFpY\nfP4bjA+9kTPKxnNH6DM0ENFDrDhHm0eQRX32asPbnNSwlsAnO3jxKagfpopPfrzDaGCKFj4xQP5f\n72Rp+lOwj64UAke5HH7nqCNygbl4PT23ttVxe4TDvWw/3eax9SKQa3k8FTmlzDHSXh2EVqXwQeil\n1CmR5Jd1b49Q2xyDNslAjshDg4lN2lkoMYJzT/kKzRsMuWnHGCAWWYHoz6b3PcVAsQFUKrja9BNL\nszuhOEBmS3utt4rvGQKGA+QawQezjpoW2ZAp0Alt0602j605aROQztGtSMMRAaP+9hT/zM+nYVMs\nbXWWCJAayOkSVyipzEAVrzCeXMwI9KZWyldA3RAzGlnAJZNAIyA1Fz70z4YGjCvWJVDw5h6wdibN\nRMYK0pDplG7jduNZlxgihiMXKd/hg25u9W0QrrjWzc2qzLSZrhaQRUCDhheu2wA/O2gBuTnwaAvI\nDmMgJrOKZlUwM/ZvJ+GZrWx5D4ZSdrpGwNzjQGdpARlRBxwa7FGNDKbOgZXHn82a40+RP/1kZDKY\nV/B9w2kY9BaQtvXpPrwcN3gwB6xGhmv3Wx6/q4EtQv6ha2xuRmQRU14A1Mmv9RLDR0T//gsOJWiZ\n9H4a91wnX18w3SfzK6cJAKZPgoybgZOAKaA9bRAHNMJQiiDcXE8dkQSHNsnUc6vSfuwgD85JBnnG\ncZiuWUYtcpHno471VU0QEwLCTV+KtTFwJnLpYp80Zr1aj1VBcwD7tOMQYxVKTs8m9+Yr+QEzi076\nljvu2UJAeyd7TzaiH6SO9aPS4Iw3oD1bPlelQ1wNBGj9HesHglnxsDLpY/571zY2n5HCnaHPUhU6\nlaFVht83gxxVeQyZ7mnLPN8eOCGs/236Qo+MtghgRi/bBAFjIe30vYQGNhFEG6M4hMDMIr4l3VzC\nWau/w/QxvPEKHBrAP8EJSVCeAhM2jj36WoSxnuD3K3jxmoEbhx/QqMBohj99CVNqcslbM07Oalvo\n7qpwOqpixJHQnmM8i6oMkW71tqzHp+7lag+rRlqReR0KveuitAEFcOD7seQfyaGZUA6SioKKvYzD\nrFLRMQO2fQ1lA2y3pzwHORvGs0dMZI+YSIHIok4bRcu5iQQMTKNzPxaMZjglFfYf0FF5ShhMsvzH\nEDwr7RnkIVrlv+zZ4rtDGs0y2uIJzUjb1knvxqMFaFNhqAtkb+l49jeOpswiJpK4dAfcA02GgXOY\n3nUunJgAdRlp7FRPpooYqoihlGSKGE2bJpDj7Sd/fnzKiVdAxCuxlNzSwdn33erVxoa+ZohEVRxR\nhMwy8AEGk5x5xPRSUOcMNUhveCcymuyolUMj0CwgDKqbYgkLamAeGzj4XiMZ0+CH3nJKvESmCgrN\nEKCH8jcT6Igcy1JmUGPRE9DTghoz7eiIrD5A9TGihznUuTUANl4eROOTC1kWewI5NbvYU3wNWGqf\nCEJe0s197MQhAyeGOwQmRfbNJawcQUol+chbZzRDRaP7IqK2OgqF9B4FK+u6jByoTmeZ9lyKPruR\n0tuyiIjtPdk+RQOxQc4n49tfATTA1bfJx79+RsfGyPl8zwnsYBqHSeUwqewjhxqiaCWYrWkLOHN9\nAMHD6Ko3XBE5oH5pBl/EnslK5Qye0P+JrRWne0F7ocAbw3OKIWA4+hJQrQY24bMJvYLr1bi22EaQ\nnSibT4spoYJ4Cslkf3gav/uw922TZsItfwa1xSLckgxnOJgfBiL/iLdldS+vGQfseiyTU2+G/z4f\nQBGjKXTQhaqSBCqIowMd+/RZ3HVJ/5/Dj2f8cyccWgf7yKbwSBbFZZlSG3cYMYSXKlYUZDeGqcgi\nEy9jVtxfttjaMyNQRfc4vI2zUQgzGrWRSOoJoJOF+36EUpgXDd/byceFAcct11OiDYGHK/nTdlC3\nw6pZPYcQFgc3fAQaA/xmKfz3ZSgD0nbG86ruVzS8GEEkdWxgLo3WlnQ2hNIIQCqHKD4rn+Vfuv41\n+HGNi34BmybJNASTWQPbA3smfE6ndw1ShwysVNQQMRy9OQls2W7ZZoL3D291mNo3tu6PMmRWqZUD\ndDccNtP+nKQ8IqgjmGaOZwN7726hfSf8bDEao0PhypfhP3fBgjeC+V/UebQSTEZLFR+iIpYqLv9q\nHea34Kl3uuJOExer+WHuHFLMh/npFwdJWwRz3hjHU6Nup5I46oikpCmDqsZYFMsEMy6sguhQeeAm\nwigmAz0thM7IImhvIW0l/mQOX6HXwPgzoD6+jGiqCQ1spClOA2jkTzwMLLbcRQb2b9bv/EgIkSKE\n+EYIsUcIsUsI8TvL6w8KIQ4LIbZabmfYvOdeIUSBEGKvEMKLOYn1yHCtW99s3xhMMknM07yWkp4v\nxYZUEKY0cLHyEec3LyO9YC9RUbDpMNz0ezh/BqhS4MfLZnDKN6PZ1TGan5nN9yzgYy5hMzMoJZnC\nRakoU8Fk+atNSoSEC9L4Un06K7RnkqzTMzYdSg8aaCSMAkMWhQ2ZVDbGHzUaAJWN8ewtHU99q5yB\ntBPELiZR+fBFhFycTGoozO+vctiPW7Qa4ZEroVC9mWuPv5qrWEL06COIUKO8jLudUuxhpNBF3O0d\nu9ryf08rivK07cZCiHE42zv2KPnIbgrOsstyfzxeddOYFKhocr4wDmRJdLbN82qkroI1tSbJwF1X\nz2XM0mlcvHg5O3UqPl2h8JtJguuOqNgYM584YyXi1Dye5Q6UbEFu1vijpao5Io9DpJFmKCG19BCd\nnWAwwwNvq/jn+lEsOfkvKAjWspC9RTnMWPU/iuafRJ6SQ3GlrZR7T8rrklEUFZHBdSgI8skh7ckT\nOOu2ZmL+Uc26f7n07flxgYNAeidcHvIO/3z+91x86fssrzgfU7nOzT16VBnnMu72jrW2dHSUeXY+\nzhHjLQMAACAASURBVPaO9Zgfkamc07y72/o2CFOkmpg7FAIXAqMMxIw6Qt2HN3DhhQ/z+seXs0M/\nhXYCeV/ZzRZm0CJCOdW0ikWvdvAkoymqyaSpXWa3CsyQCKNVxUxfu5H3fg1n/wVO3ZrMPdNupubS\nGFZXnEon8se2i8lsmj+H4orRNBlDYU8v45/QFck6Up+I0aQmNqwas8UI73+pjvffcu+j+3Ge77dC\nevQWNnTCqR/eTNuHQayuOXegbYBbuNs79idgPnCrEOIapBvnLkVRGnCld2w3DtPVMMUVWpHLlzjL\nYbw0x25sl8sXR31fum3n4DWLA+KKjLcQEWau+Op1OioVClsz2aSfRVlHEu81X0lTexjBuiZ2Bk9m\nW/o09teNPmo0ABRU5JePQ5WsYDC2M24G/HzNKazkdLYzje2NU2kzWvwyFWpoE2zvnA2N/QRxNwfK\nJlTRJkg3Ut0UR2yYlJ6KfPBrVj02lOp4j21KLCuMMSG1ZD76PPEL6nkHV3P/B76ZsSe9Y18E/qoo\niiKEeAR4CrjBtcN/Z/N4Ju4ZDiuVllsUMjDphfrTNoO8xYVKMWRnaQe2Q/jpDVy4dRlRxbW8suUG\nVnEq1R1xHKhOlwvAOjUtRFBQH0VBsU3aZjBdtX6jDFQEJJA63sTq9ZD4Vh4tv7iIso5k2hpCZCWu\nNVekFZlPYl8ebxVhjrZ5TRGymrdaA2M7KCjPYmxCHulfllGbAkd8nJzmB6aPhbOvhr//GSa8kMzK\n8edTt9qdWipnIire7R3rlOGw9I79CHhbUZTPABRFqbLZ5GXgc8vjUrrrhafQq9rAQpcG6xy1dFng\nHOQZ6GEYt7LJsZqYlW04XC39u+B37JwymcdS7iOGaoxoOVCWDjttKoBtWwLaEo6M2BzUUnswiePm\nrueWsue5fs1jbC/awQHzdZCr69rHIXovtT1kcz+Wnu0183UYJ8J2wzTe+PkJMl/8iJNv/4nNJrgx\nFb6qgl0DI/NwTHPfPHh5P5iPQLUZ2m9LZt1vk7izfhM7KwRfJJ5H1aFRcmNbYal+C9ycEVKZTPeC\n0iUujd0eZz2LrwG51obTAJZG01YuQuoXASwDLhdCBAghMpCF6D97NEq3yUPGuH4Edni2q5oWaOzl\n7DHhOHP0gJa6wlgSH93EZd9/hmFnoGyzYGU3vSeONSBj+5ZVQ11JDEdyU3h00b08HfpIl9Fot+zD\n2fr8fBz38ijUUlKVwVoWUvDbxXxthE49hLwNmkVO7ttPnzS+Fs7C/em06iEjGdbefAf/4haW3302\nW087zLJ52f3vZIjgSe/YK4UQU5EZ9SXATeBi79ge5CFnCd7GjJzOrUdeyuPo6vvoAq02Sxd7XY8S\nZBwJ5CTHMjmpio5i+ZWXop2pp7g6HfYLaRSc7aWxy7K/Wi3vTPwFsT9W01IXLR2wBmRLB1dpRBqP\n0TavtavABEWVmShxKv6/vTMPj6q89/jnnSyTjSwkkLAnQNh3EUSsgHUtFq2orVavrbW2vWqvtS64\n3Hqt2qu11S7qXdS22GrVWlGsWMAFr6IikAQCAZIAYclGErJOtpnMe/94z3GWzGRmMksmyfk8z3kS\nhpPzzpk553fe97d9vyKfYg77+JydrE7dy6xKeClI2zuc+fYFsHPqfHaYlnDknXj+fu4F1FhysNhS\nOJYziUesTfy1ahX8HvWd+l2nUhG299wX/kRVtuO5ZOKfffzNf9IvJZFIdGtt1rYyVFBoLGrxP6Kv\nP3IgUSHbhFhId3LEWrTNeVWU382SrB0sOXAEWQOmWLtKRalA3fSBND0rh85PR3DC+X0G4xJqQcUE\nJzq9VphA12KwdCZTkLCIHKopJ5+aR/dSZBiNoNhxEMbu6aFw4SJKz1Wp5tYeFfVqtGTwyStm3pdr\n1XcSUHFbZPM3dKIkc1SnC2gkco31JMr9ortg9NlOpufdnem0QU2LqwzDAZSPV+PO6Y8hrJJfTryT\ntxovI6bEBJuB1hC9fXcxbR3nouK+PsrTqMWqswGyQnt3IkkJ7SRbW5lXs5ujhnxl0JSfgNJn2zjw\nPzMpq56G3J8AHcpTYG+Cn2e+D/tRBj2g/MYm37uEgSgzHKDK6Rf73Cs8HHT6fSwqvOsjl+N0u5q4\nZKUo/dojqPbhc+GM4mKuaf0rlMfCIbDt7+fb8lRA3NfbchfdTkAlqcXS26tVj/KjTNL+3W6CkTBT\nlnB+02bemFjB9MFVfxVV/CAR3jApPZ0Fj2ay3pqALEgEu1Cfu57LaMVRr+J302hvleXhJwoNh+5p\nHOh2VFXapt+hHirMdPQq27REOB2nslzi4Nqlr4AlRvllAy0lcF4aePpbPbE1ARUp6YtOVCQuFmXk\n3LV1G3EYDo0zt73Bh1crL+qhgPtCGOi8EGdi6sFVTI9r5JWYyzl+Ms+xFNEfJD04vu+G3sfwThgb\nXvkgCg0HRJc0kG7Vt6OWMPG4ehWdaO6Atk4wx8EnCciiGOWD9aX6oEeQJf5riVqdfu4CUvA9lq6b\nsove2rp7cdH/jlk2juVN3h1Z3xgFG+q8/KcBAFevgZg/TOTlzDP4nGXstczTLm2hImq6ASl0+iN3\nI90RnQWHUWo4igmsdiVS6I+DatQjOlXbnOiR0N6tthQztJnV8kXgmj8b6gSrNm2rRBmQbB/7N+HQ\nwZqCumD3AqZ4Vtb8BdPlr5H94wyWb2pk+0Hl8/3pd2FbF3Snw9zVUPEdKDSMh0euHgfTH4ZNmVMo\nYxqt7s533Yi7Pyjc081t3rJ4LfSjRVjIiFLDASoLtB8h04ihf8MpQB69DAhAW5fadAdqJLIxu1Br\n5BOoJYmvWr1GVIBpLMo6nIKtE39AbF0Or5pTuT31We6Y/gVPXmPB/lWB+doFVInJlFp3Mvr08bCe\nymDmtUoY9y34ym+2ceaKqZwyO13Lzomezk27KgIZocj3LmFkgOURHvSxVzTOOvrCR7VuZrLqid9f\nbZf+kImya/6gG5psYHoPTLWSl32Yp+Vt7Ez7iPjZI2jf/SPsmJjJAQ4nvInsksw3wV57dC0wo4nv\nbocjz6Vx99Mb2VW9FPab1X0vcXVTVNBbrb61EyzuTlAJfBrkuwpOHiHKDcc4gktWGAh8VOuahKq6\nTelv+XQ/SEfl7/rDDNQkKhOYICFRMmr+SeZkFxNDDw1kMpmjmOlkifyCBXu2cHb1Mdr/G17bGEIl\nwyFGohna7z2HF277I5UfT1WGoxLX3rWF9O6SWeMpNltD79BZoAw5XRVnBi7c1H/aUWGVcs//bZdq\n+VLbopypkaAJlanqz3B6RLoFQECHibrPJ/Lh3gvY1Xgm7TKJ40ygiwSOiDwqFyykfUU8abmQ7WcO\n3XAkoxuuqPqEFU8+CiYJnp4bfhclD7xjKYp9HKA+IC8RjKjGhkoLrUV5HnN67yJxVN+mJqgcEHMY\nvw5d43Ymvmv+ylC5KHtQnRpjgaPxNJkyaWrPYGpOKYkxHWRTQ7psIq7Jzn/8LnxvfShw7fZE3mtc\nScNFa+ALG2TGuWYON3r4oy6bhxebCUsHvACJ8hkHhLIUeGA4jDqHPqrQWjpVBWRti+oBEk4O4Lu+\npVnbR+IoXQSoVIatvEYVY83u2c8Xpm0cX+npAh/6CGC0n+lGPSUdlH1tMjUxOSRMaYVZNtf8G09r\nPIunL+pU4G80DAwCw+FN7W0w0YpawPooYZWoKtyaFu+VuKGg2PcuLmFBvUtBp3D5Ks778H0AXomc\nnEdUcd/Z8K/f82/f394Esbe8y2r+we2jn2LzslUwxta35li3p+veMBwBMFSKJQpxbbTQB+1WNQM5\nbQnPLGQXfc88nGfDX0ZdXX1pH3z1vNC+p0HE9T+Ho5sm0vbvcdx0ju/9Zwj40beO88O650hJfJR3\nPprLNPOeAO/A6LHQg8RwtDJQxTyhpwOVhVrle1eJeuo0WNTWGuLq4WL6Lq50zmh0StlIS1IL8qaW\nkdzxMNw+hz4RwNocWOErKW0QkZqWwRdpZ7Jt9FeoX6saM7l7spZpUhmLYqBEwh+/YaN4dh2p62aw\nc9VaSkfOx4PUjaLWkx8jVNWRwTNIDAcMnVmHzlGUAfEzcmTtUfH8mhb1szNEqcgH8L6CkjiWJk5t\nLadkHCaPI6SmNXHknmm85CNNXgiYeBes/F10p/T1xag4uP9ByP86pMyIZ9OPz2cXZ/Ae5/PP229m\nbWM+aWcoI3lWDKx7IZ7sRxPJ/zrMfzGFB1+EnEbongCz56Wwqm0buRmHVfTehmtHCWuPh6QYG/6F\nxSJDlEdV3OlvQ+NoZieqgC6Ajupfzjw6YJSmQBcTxDOgBM9ZpnaUXdMdgFb42th/sPSCOzh/vZmZ\n3eUkJcGOPmxfDPDAGth/+2RSrG0se6SeD56y810TvHUajg0S91WdFVp+FEN89sXUsZjNLKJSuxZn\ncID8xDIuOaeMUweUMFtSVT6bHrgC0/ftdFPO6qItXDy/keZP0kgoOcSCkjJWvvokF17eCB+4ffd2\nT7lVYRAJCIJBZjhqGHqGA5TxGIWrQIuf6Nq3JqE6k/WXPai8tb4apB+GcjmVh2Kh/rpy3tkD110H\nwm1WPQ9oEFCpXf/b9ploNE2j2DyHrPsauPDOj0nbcZiTKwdPrmmGgONJUyhnCl+whFqnhUkp06h7\nrY5n/pnCjBNfoXRnHA8vu45aJjKNMmzEkjmpHhnzPjsSb2XLGRdSUj2Hyx56E/7k4YHRq8eov5WP\nkSPKM0c9kUZ42gtGA/00Hs6YhKqLSe9nW4JZ9FaY0NujJADXdHJP+uMstuykdtw71DldPl+PhcTZ\nMPl38LfbIWYPzHo4jb/PuZCqNedix0QyFlbwEZeVvMurF9k57Fa/c3kGvOkppyFCzJ4CS2+Gbfe4\ntmY1x8HkZfD+b+9j07TvUtno+gAbmdCA1UNh0PjME+RTxv3WX5D/s2Ke6FzG41duw14fr1arO1C+\nJN021LcpSVIX9hJ6/0ZwmaODbMYB0Wh9Q0edtgUhsG2Xyv9RY1UJZUnxgSWWleBIO9dpRxkTrWT/\nb0lryUmt5JpPoOhc+KxH/VfaxZDztJmPJy1m9A4TpR/G8cyJXMrWXPnloRLoZPypUh5faKfHaYkz\nzgRXPwAj8uGj6x35UPGEP394QRYUaTUiHZ3Qc3sOC5emkPNCOaV/gXoJXVY4++sZbB05RhmNmhg4\n6TAUp92lg8ZbIV5ysDOFtJxmrDcf45WPIan4bOzvxSnf0hFUwZt+SXfZPBgNiCanqI4/2rFmIcQO\nIUShph37oPZ6hhBiixDikBBisxAizelvwqQdq7OTwZ/b0RdFhMQR1mVT096aFvW7x7WzBw7i6jDV\nIy+jITO+nmWxn7Hg+ud4ZTksfySRUYmwaBl8sRfqtts5Lify57jrefnC+9ly3V18VLmKjypXcbQr\nj+NM4vPR5/GN5slMcWoeVJ8A5T+dxaGrczHPdkzf1z0Ok3IgLxkmTYFJaZDlpzqnOxPMMGkMTM2H\nn62Fielw729imP+/KiqSCEzdfQa/j7+FHSvOJG9EAjJVTbRSEuDg3BTeTLoMjsY5jEY76uYvctsO\nxsGReGRBIp9Xns2OP17LNx5IoTxxCjGpVmUZq3F9DvYqZgOXcFYU4ddSRQiRJKVsF0LEoEIBPwbW\nAg1Syl8KIe4BMqSU64QQs4CXUB6/8cB7QC/t2P4vVXTmELReStSTiHI8hLCaNlkrsPOnQncRjkfL\nYmCZnXXXZvKLPzbxwlUmujpv4LQcSfrMXzP94DmMnPkp7x+0M75lDb8Z8VMqWvKobx3V67DTxx7g\ncrGBmTMe5liFIM0qubEllqeSb6eLeMb8YSvf+WYB5n2wZ6lKr5xtKSFhD4iNYHkRnqjudVif3DMJ\nEn8OHWtBIngv+TyatKasx0e9RdZfz2bL+d//cv88jnBj1x85vOoosy/N5fknG3nstQZojXH0L/HF\nAvVjzPlHeLbiVhb8cj/5V5djezlO5crsQgmd11ugx9NsY3vgJ+oXEViqSCn1549Z+xuJ0ohdob2+\nHiXLtg5YQ0S0Y/ehCip8tdcazHSgHl8h1Ma1dKst1qS6tMf2MeksAOaivvUqyLeVM632InaVFtPZ\neRZ31v6aFNHGzA2L6WAc3yx5le8teIaYDdt459uXUWhZ1Fu/dnY3pVXTOTpmMnGv3kjD3FmMeHkr\n/564gkrGUc5UMm48m8+oJnfpUcx0MZkK6pJGsWrORySUwEv9TJ58ugruqoIjiXmUm6ZSRj4nGE89\no0itW8YGllDVNo5GSwYmk53cURUkmjtZYv8FX7/7dQ4sWaCMxkH8b8iv1/0A2afr+N76Z+Ad1CxF\nPw+JF6MRbAVs+PB3xmFCdQ6YAjwjpbxXCNEopcxw2ue0lHKkEOL3wGdSype1158HNkkp33A7ZpAz\nDlCSBrOCPMZgIIOwnWdcDCTFQWIf4eDpqI96AnBND8lJreRbyynqWOjQqc2yccH0dzl3yb9QW3ov\n6zdfTast1/sxM3tIzm0iLtl1ep6W1ESSuQMTPUyjlBG0kE8ZsynhwprNvJ8LBf3RktGYOgZWHc1g\nu3k5H3MO1YzjBONpJZWy6nxsdtd10NSkUhLbuiguXQQHYhxN4CrQSgS8DJQF5Gq/z4Cvnn6MS244\nzp1/eFY9C/aimi1ZtQQ/j+wkPB6evcC6iMw47MBCIUQqsEEIMZveKSr9CM9sc/o9F8cn7S+t9FYW\nGoo0oqasswi5dIS1B5p7oLVLLWGSPBiQQzicpa/EYElPpyjeqRN9DtAQy9aG1Zx870MO7JutmjY7\n56hVo3KYklGTxIYYLA2ZkNYD6XYYpXxWTe0ZTMo6SpK5g4PMZBYlNJPOmD2HMf8DDgVhNADKq2HO\npY2M/lsd7elJNJJOkz1dSRZggroYOOYwHuXMU3U7urdWl+TxRb22CaAO3p+wjvcfQxWz7ccPo/EZ\noW0NqGvHOntj+09AURUpZYsQYhtwMVArhMiWUtZqcpD6xCvC2rF1wBgGvit6JChBLVvc46UhwC5V\nlW5Lp2ed3DZUiroeYRmlbeCIWx4ycWC7tqg34zknRBeuAk3LNgaatZt1Sjdk2DlWn8eU7HLiY7vp\nwUQrKTRVd/HIA6E51U8+gLUfFcJl36aasVh74pTROBAPFm3pJnHIa4K6h4sI/F6WKMNzAIdDFFT0\nxKvRCEc/0Xmo7tT6CX0U1NH8iapk6RETIUQicAHqY9gIfEfb7QbgLe33AdCO3cvQjrI440eVbbDo\nFbrudKFsVwvKXpf0sRWhfCS+avqctWwPx0OB6nBzskHlSZiwM51SJnur6egHrXaIm2BlunYTVZzK\ngyKzw2iAuqScqxwKCfxeLnDaSnDt9lXfl8J8uGTzSkN2JH9mHGOA9ZqfwwS8KqXcJIT4HHhNCHEj\nyqZeDcFqxwbDIYaHvwPUVZyICnuEkZoWNfNIiVcZUDqlqASLkXhP5JU4Fq+7UEuUMag2hu44a9na\nBewx0zUfeuwmsk21XPqnjYiY0x7+sH90ARvOlcT/aAtjnriYA12zHV3HQTk/na/YYvpeiNfgmP37\nSrmw2X0YDV0nI9Toss+hwR/t2GI8XKFSytPA+V7+pp/ascHQiosLe8jTgboYQhhx8YS1Bxo7ILkH\nRiQ4Xu/GIUGZje9u6hZUN8VElOPQvVK2BbU0SACsAmpjKGUGt3xyGx/fW81xb3KX/eCcOCjsgm8d\nKqPVto0P7BfwZci7DNeIyX48tx84iZqBBBLh6e5RbRL6pB9xZp+cItRO1kFUHesPp4mmCsLw047y\nvEdgQqdX5roLBNWgZtbH8G8F1YHybXiKRjgrcNbGgoRN37yDUTePJRaY5mm20g/OPwu+V5nE5hev\nY1vsSsd/tOHaZmAfvS+nRtQMqobAjMZpix9Go4zQt49oROW2h5YhZjhALU6jU/0qPHSjWuVHqIFt\nc4cyIO5ZqLrPYx/+PdyO4tl46K91C7DDcSaR8cAYJq+O5+r7Q+MW/o+PYU9JFiXpM6hmLCRK1UDY\n+WHfgevMQ0/WCjS1oseuChE9dvNyJ9TdvSRem2YHyRA0HODagWa4UEpExQnqWqHJw+xO16n1x793\nFNeGvV74S9y1JL+9gp6N/udd+eL0quMstu1itPMbcJ4QOAuEN9A/v2KXTRkNj8ld7uzzvUvAFBAu\ntbdBWOTmDxL1aOiroeNQpAJ1oUzwsV8IkKhiukbp6NLujK5pG4sSufOWanMCFRAbq/27HqXpkmD/\nMpzbhZmROw/yRnHobgNLKpx3YjuT/rCd91rO4aELXkfqfg7nJVM5/Vs9NLZ76VLuCRuhL94sxtXj\nG1qGqOEAdQXG0kuGfchzHOXo88djGQL0p6qn3A9Q164uqj0ej0oRVKGMRDYOn0JWDxnJDSykgLFU\nM0LAoSCX/5csg7gFsHAyPH0vHFtRR+kl80lcOwnRLZWnqBWHRGMdgRsNS5fqF+vXLAPUHCrUqvP7\nCHfIfggbDlAeLIFKfBlOHNO2ADuLBUODxaGR642T2jYdlYnqnPB8AmU8soAeycjJtTw84gFGf1DA\nhDMEaYdPIIAJE2FyN4hU+NDP5cNYAVUSpt4XR8ml86ipLaHhrg7G/2MM/zXvFl4q/xfYrxk9PXej\nid4C0H3RY1dGtDXQ1FZ3zcdg2UskAgRD1MfhTDWuLVmGEzuJqKL56XY1+/CVtnMI9ZB1f5pXoJ7y\nlYKfLZzK5OT1jH2ihM2Ze5HXQ6IJbvgFTDg+hmVb4WatSXJfdXrZiXDzU5A/CnZcupx/chH/k30r\nd60303hVNbe0P6N23IvDj9FMYD5FKdV5twTqgTlOYNbJF1YiFVUc4jMOnTrUnDnI7lqDkp1EVLy7\nR0ulzkrxva+e1zHb6bUqIAfueLGFxelvYZqXyeUnXmJvXQE/eaKIxlwoiFvEngk9jH2umB+9XUn2\naHj7DtjtwUaaE6DrSsi5+Wz+xhrqGQVInljyfRIKYrmq6u+MG3mCSqY6liiB3MsB+TLcCWFyCq2o\nsFZkGCaGA1Q8ezg6TG2oArnRRCw5zmZXs4+RfgRPO1ARmAzUitKq/m0nni9mXwWtNsrnTuWG5l8x\nwVrEwYyv8SEXgQDzWV/lorM2s2r3/7Hb7jkG3AnENsDBMdM4Sh4nmEh14xg2pF5BQnsnHySuovLt\nPIdfuQn/wsl9Fqj5w05ClzbQSCjTyf1hGBkOGL4OU1A5ArFAXmSG69a6j/nTutCK4+2NRd3t9ajl\nw6xY6q3j6MkfS9nra3ic+7ARRxIWpnOIJtIhFS5fCm+6dXxJQAVoNl4F01/9lBMLbqOmLoemE1lw\nIo52ktnasEaFhfU0GH/SYYKaZUBoMzmbiLTRgGFnOEBND+1E7AaKKqpQ5z4OdVuFmS6b2nJS/dtf\n16gai5oczkDNvjNj+E373SpakSDBBCMSWojNtLF810bWX9mNrRIWjIEipySumavgzMvjeO4nVpqm\nXEN1Uw5Nn4517HAU5c9oxZF821dU1Nqj/BhBKes1EDpFtnYGSm9oGDhHPXGKgbDS0UENoQ//+eBU\nAM12q3D4GPR8igZgpwleM0OhGQrMtHamsufUfO6e9d8kHL6GWcDFJXD/Y5CVAKtz4axn0vjwtkux\nt95BWdIsmixO3eIO4TAS/mSD2rSlSVBGoxbXJJFgaMc/EeDwMEwNB6h14VBThwuE7YQuD9MHdhmY\nP6AOR3mFcwanDTgkVAXtrgQ6S1N517KGF2JuYlvpnfxv+k3Ic6HTDp8eg+OvC0pFPvuTFlARkweV\n2gS7DEfwwXlp4u1Z0mlVPUGDJlSZvY0MpNGAYW04QK0Ph2uoFtTMY7/PvUKCtUc5TP2lGbWq6sBV\nZrcdRz1LQywdHclUdo5jc95lfMYyPlq0nFVXwrLJ0LwwgXaSOMgMKurzIFWbLTjbAOcIiic72trp\nObU+YAoJTajUOW48cAxzwwHqkVMx0G9iAGlCZRpGQNS72+ZHhaiGDUe7viocoVJQyWI6hQmcaJhE\nB0lYiecT83ImPDcCSw8kXjKGGK3BU2J8O4xwyy+pcH9/Tr9LqZZYHiULAsGOiqAEm8lpJ3TGJ3gM\nwwGotecOhldVrTPNqJlHBC7K7h4fjWyc0J2X0Ns14MHVILATL7sxn+pidyuc+VAhayz/YHnzp4xJ\nrcYkeiDGS3Kau32obfVfh8YrdlTv0FAZn3BLU/mPYThcKGT4tCD0RAHqAg0zNnv/bkrnAlI3d0FD\n20jmsYeLLFt4Y043808uZ/fKOXw+oZBfnbqdK3md63L+zNgzKjwriDofO6hQqzOh+CyricZqb8Nw\nuCBRJZ2hcIQNVrrx3Sg0BJxq9S9C4Ry57KT3pGihckzkmY+y6k+bOLamhDNKJ/NywrX8euXdtDXc\nSVlhLKuvfIZpc+7mV7a7YGa3aqas04UjM7/D6kH0uT8UEHx1aiUqLT18Va79JRgJyAeFECeFEAXa\ndrHT34RZAjLc7EP1Yx6udKCiLlW+dgyOdj+n3s4rG2dfbqwEASMSmxkbV0XV/1UyeVk+j5nvY1Pr\naj62nMvz7d9nxvY4Xn/9Tqy/vYQpb+zi0rkbWNr4rOM4ev+cDqtqVBQ0uwlu2WdFffYnfe04YPjT\nc7RLCLHKWQJSCPGu9t9PSimfdN5fCDET1bh4JpoEpBCilwRk9NOCMiCTUGpEw5Gj2hamKlu9DWGa\nD2mLFlxFsOuAVIiJtzFv3G5MJjv5lHFFTCt3PrqOjbVrsNRpSWddJpLPa4eDXTBFsuOCTTy6/yGu\nu+dP8FPUBEvv5RO00ehBNfQPprCwm2hcmrgTjAQkeBY1vYyISEBGAgsqdXE46NT2xU7CVuvSofWu\nGBng5xsL0+fs5W7xSy76+3skZ7VT+Nxs7rE8wX/tuwPazK76rkVmyIaP551Py5mPc+DJBcoA7cUR\nQQkKCXwe5DEOE/oy+/Dgl49DCGESQhSi0g63Sil1r8+tQogiIcTzTmr143ANmFVqrw1i9jHQE3HZ\nHAAACcVJREFUCTcDzynC5jz25etwb8WpraAqTJM4KKbz5nXtfPpDeIQHmNF8kO62BBWFcReFrgVL\nQSql9mlqJVqkvV5vCbLf83GUbywYShksRgP6LwE5C3gW+LmUUgohHgF+DdwUvrc60LSjyjgz8S4m\nMtRpRz1VQ6xlK1ENkEel9G5BCL19g1q5iQDSaWbyr+Lp/tpSGhqzaPl7trLxjXhO6MqCH7z7Z/VV\n9qAyWv3u1uWJ47g+JwNlYFPH+0u/JSDdfBvPAW9rvwcgAbnN6fdcAteOjTSdqFOJRakRRai7VtSh\na9lOwXMvwH5S1wZZyRDrSTvSjYkwPvUEVx1+kx/f8gKfWs6mZvtENTvxJk1iQd3n+gym2xZE7UkX\nwc8yDhGRxDtAZbtVhOxoPg2HECILsEopm50kIB8TQuRIKfVOJFfgiIRvBF4SQjyFWqL0IQG5Mqg3\nP3DorfnmEhYd10HDYZTzdB4h8wF12iDFh+HQrtpjLbmk7W5jd9oZ1JROhM9iHcsPHd07597jxhZg\nCrwLhwmuCc9AzDJycX0wB6cdG4wE5ItCiAUoF1QF8AMYSAnIgaAYNW0fjp3FdHQ1ZhOwLPjDtXWB\n3Q6pbpGWctQjCNRHnmlj2uhDWFfb6ehIgjq3S/kYqqbF0yrELoMoWgtWRT7C7RzDhBioe1oIIeHB\nARk7PIxg+GjX9kUq6nPwY7nRF/ExkJEEQjgOOw3VZnAifP/635FrOsIW80Xceutvuer8d+DTGOUU\n3YP3e9MvGUZPFKPiwv2liuB8IaHmIaSUnqKifmEYjpCShgpbjvS14zBAF4gNUrfR2eexGFgJl9y0\ngWOWSZS8pSSNR8w9TfwhGw1Pj+57BdGvfhoVBFcOfxxHz9towjAcUUg8KnHMMCCKGSij2s+Gcwmx\nkJ6kVkM/BBbb1P14QDveYW1r9PL3nVa1BLL5u0ToRjktg+nU1YFaK0VQXS8ggjMcw7B1YCToxnHR\nLWT4Rl90nEtbz0QFUgMQi+q0OcK1zwiYEOtqk93zNXR03Va/6Ubd6MGk2nejHDLBJpRFN4bhCDuF\nKMOxcKDfSJSwE4fhmIaaifhJXRuYhJr5J8bBCC99U09bAqzA1fMZgy1bLwzBMQYHhuGICN2ojPtU\nVPZSADfLkESiPhM9gp+p/czDtWzVA7oxsHQH0WSnBzUjbEPlYwRLKd7XSUMTw3BElBZtS0Y5DkcN\n7NuJGhrcfqbgMCYQXKauc4VpKFXTdA2HaPVhhBfDcAwIFlSv0yOoImI/5QOGDW241tKH8oYPlhaG\nd8sFhWE4Bhz9IkxFqTEbvZWiD71r8j5fOw4bDMMRNbSgnHRJqEx9I5QbHRQTfKPhoYdhOKKOdpTj\nLgGVjZqLMQuJJI3a5o8W5PDFMBxRS6e26RdwHiqsG2QmpoEH9HLZo33uZeDAMByDBueLOh81IxnO\nlbnBIFE+i5MMtzBqqDAMx6BEz0rVlzCLCLqobNigJ3sN/grVgcQwHIMa/eLXG8qYUcuZGFSEZrjT\niKOrz9BOAY80huEYUnThyITUe0OP0X6OZ2g7WZtxyL5FYzXq0MIwHEOearef4Aj56gym0G8zjobJ\n3URXctjwwTAcwxI95OsNTwV5kajwtdK73fjQrzQdjBiGw8ADngSBAjEc81B+lmoC6805PCpLhwKG\n4TDwk0Bu6mC7fxtEO357yzRRpgIhxEbt3xlCiC1CiENCiM1OgkxDQDvWwMCgLwJxs/8brk3m1wHv\nSSmnAx8A9wJoYk26duwlwLNCCC8tyioCfsPBEcnxIjmWMZ4xXmTxVwJyPPA14Hmnly8D1mu/rwcu\n135fg6YdK6WsQHnhlng+ckWg7zdIIjleJMcyxjPGiyz+zjieAu7C1eWdLaWsBdCEmUZrrw9B7VgD\nAwNnfBoOIcRqoFZKWYRndXqdISq6ZGBg4I5PeQQhxC+A61CpeImoWu8NaCoXUspaIUQO8KGUcqYQ\nYh0gpZSPa3//T+BBKeUOt+MahsbAYACJmK6KEGIF8FMp5RohxC+BBinl40KIe4AMKeU6zTn6ErAU\ntUTZCuQPXRlIA4PhRzB5HI8BrwkhbkTl/V4Nw0071sBgeDJgSm4GBgaDlwEplxRCXCyEOCiEKNWW\nOeEYo0IIsUcIUSiE+EJ7zWvSWj+O/4IQolYIsdfptbAlxXkZ70EhxEktMa9ACHFxKMYTQowXQnwg\nhNgvhCgWQvw4nOfnYbzbwnx+ZiHEDu3aKBZCPBjm8/M2XljOz+kY4UvalFJGdEMZq3KUuGocUATM\nCMM4R1B+F+fXHgfu1n6/B3gsiOOfAywA9vo6Pkq+vRC1NMzVzl+EYLwHgTs87DszmPGAHGCB9nsK\ncAglABuW8+tjvLCcn3aMJO1nDPA5KtconN+fp/HCdn7acX4C/AXYGOrrcyBmHEuAMinlMSmlFXgF\nlUwWagS9Z1TektYCRkr5Cb37zoUgKS6g8cBziPyyYMaTUtZIFX5HStmG0nAYT5jOz8t4eu5PyM9P\nG0dvXW5G3TCS8H5/nsaDMJ1f+JI2FQNhONwTxE4SngQxCWwVQuwUQtykveYtaS1UjPZy/HAmxd0q\nhCgSQjzvNPUM2XhCiFzUTOdzIpD05zSeHr4Py/lp0/hCVPnuVinlTsJ4fl7Gg/B9f2FN2hzKLaGW\nSykXoazuLUKIr9A7SS3cnuFwH/9ZYLKUcgHqgvx1KA8uhEgBXgf+TZsJhPXz8zBe2M5PSmmXUi5E\nzaSWCCFmE8bz8zDeLMJ0fiICSZsDYTgqgYlO/x5PGAQ4pZTV2s864E3U1KtWCJENIFTS2invR+gX\n3o5fCUxw2i8k5yylrJPaIhV4Dsf0MujxhBCxqJv4z1LKt7SXw3Z+nsYL5/npSClbgG3AxUTg+3Me\nL4zntxxYI4Q4AvwVOE8I8WegJlTnNxCGYycwVQgxSQgRD3wL2BjKAYQQSdrTCyFEMnAhSpJrI/Ad\nbbcbgLc8HiCAoXC16N6OvxH4lhAiXgiRB0wFvgh2PO3L17kCh0ZhKMb7A1Aipfyt02vhPL9e44Xr\n/IQQWfqyQAiRCFyA8quE5fy8jHcwXOcnpbxPSjlRSjkZdX99IKW8Hng7ZOcXqKc2FBvKuh9COWHW\nheH4eahoTSHKYKzTXh8JvKeNvQVID2KMl4EqVHfg48B3gQxvx0e1HShHXaAXhmi8F4G92rm+iVrD\nBj0e6onV4/QZFmjfmdfPL0zjhev85mpjFGnHv9/X9RGm8cJyfm5jr8ARVQnZ+RkJYAYGBgEzlJ2j\nBgYGYcIwHAYGBgFjGA4DA4OAMQyHgYFBwBiGw8DAIGAMw2FgYBAwhuEwMDAIGMNwGBgYBMz/A1kD\nBC2GmxRIAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10fca38d0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def mandelbrot( h,w, maxit=20 ):\n",
" \"\"\"Returns an image of the Mandelbrot fractal of size (h,w).\"\"\"\n",
" y,x = np.ogrid[ -1.4:1.4:h*1j, -2:0.8:w*1j ]\n",
" c = x+y*1j\n",
" z = c\n",
" divtime = maxit + np.zeros(z.shape, dtype=int)\n",
"\n",
" for i in range(maxit):\n",
" z = z**2 + c\n",
" diverge = z*np.conj(z) > 2**2 # who is diverging\n",
" div_now = diverge & (divtime==maxit) # who is diverging now\n",
" divtime[div_now] = i # note when\n",
" z[diverge] = 2 # avoid diverging too much\n",
"\n",
" return divtime\n",
"\n",
"plt.imshow(mandelbrot(400,400))\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Thanks!\n",
"\n",
"# http://tinyurl.com/af16numpy\n",
"\n",
"# Questions?"
]
}
],
"metadata": {
"celltoolbar": "Slideshow",
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"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.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment