|
@@ -13,7 +13,11 @@
|
|
|
},
|
|
|
{
|
|
|
"cell_type": "markdown",
|
|
|
- "metadata": {},
|
|
|
+ "metadata": {
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "subslide"
|
|
|
+ }
|
|
|
+ },
|
|
|
"source": [
|
|
|
"**Vectorizing** code is the key to writing efficient numerical calculation with Python/Numpy. \n",
|
|
|
"\n",
|
|
@@ -26,7 +30,7 @@
|
|
|
"metadata": {
|
|
|
"collapsed": false,
|
|
|
"slideshow": {
|
|
|
- "slide_type": "fragment"
|
|
|
+ "slide_type": "subslide"
|
|
|
}
|
|
|
},
|
|
|
"outputs": [],
|
|
@@ -47,7 +51,11 @@
|
|
|
},
|
|
|
{
|
|
|
"cell_type": "markdown",
|
|
|
- "metadata": {},
|
|
|
+ "metadata": {
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "subslide"
|
|
|
+ }
|
|
|
+ },
|
|
|
"source": [
|
|
|
"We can use the usual arithmetic operators to multiply, add, subtract, and divide arrays with scalar numbers."
|
|
|
]
|
|
@@ -120,7 +128,10 @@
|
|
|
"cell_type": "code",
|
|
|
"execution_count": 28,
|
|
|
"metadata": {
|
|
|
- "collapsed": false
|
|
|
+ "collapsed": false,
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "subslide"
|
|
|
+ }
|
|
|
},
|
|
|
"outputs": [],
|
|
|
"source": [
|
|
@@ -133,7 +144,7 @@
|
|
|
"metadata": {
|
|
|
"collapsed": false,
|
|
|
"slideshow": {
|
|
|
- "slide_type": "subslide"
|
|
|
+ "slide_type": "fragment"
|
|
|
}
|
|
|
},
|
|
|
"outputs": [
|
|
@@ -174,7 +185,11 @@
|
|
|
},
|
|
|
{
|
|
|
"cell_type": "markdown",
|
|
|
- "metadata": {},
|
|
|
+ "metadata": {
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "subslide"
|
|
|
+ }
|
|
|
+ },
|
|
|
"source": [
|
|
|
"When we add, subtract, multiply and divide arrays with each other, the default behaviour is **element-wise** operations:"
|
|
|
]
|
|
@@ -311,7 +326,11 @@
|
|
|
},
|
|
|
{
|
|
|
"cell_type": "markdown",
|
|
|
- "metadata": {},
|
|
|
+ "metadata": {
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "subslide"
|
|
|
+ }
|
|
|
+ },
|
|
|
"source": [
|
|
|
"What about **matrix mutiplication**? \n",
|
|
|
"\n",
|
|
@@ -401,7 +420,11 @@
|
|
|
},
|
|
|
{
|
|
|
"cell_type": "markdown",
|
|
|
- "metadata": {},
|
|
|
+ "metadata": {
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "subslide"
|
|
|
+ }
|
|
|
+ },
|
|
|
"source": [
|
|
|
"## A *new* dedicated Infix operator for Matrix Multiplication\n",
|
|
|
"\n",
|
|
@@ -416,7 +439,11 @@
|
|
|
},
|
|
|
{
|
|
|
"cell_type": "markdown",
|
|
|
- "metadata": {},
|
|
|
+ "metadata": {
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "slide"
|
|
|
+ }
|
|
|
+ },
|
|
|
"source": [
|
|
|
"### The `Matrix` Array Type"
|
|
|
]
|
|
@@ -438,7 +465,10 @@
|
|
|
"cell_type": "code",
|
|
|
"execution_count": 37,
|
|
|
"metadata": {
|
|
|
- "collapsed": true
|
|
|
+ "collapsed": true,
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "subslide"
|
|
|
+ }
|
|
|
},
|
|
|
"outputs": [],
|
|
|
"source": [
|
|
@@ -524,7 +554,7 @@
|
|
|
"metadata": {
|
|
|
"collapsed": false,
|
|
|
"slideshow": {
|
|
|
- "slide_type": "fragment"
|
|
|
+ "slide_type": "subslide"
|
|
|
}
|
|
|
},
|
|
|
"outputs": [
|
|
@@ -707,7 +737,11 @@
|
|
|
},
|
|
|
{
|
|
|
"cell_type": "markdown",
|
|
|
- "metadata": {},
|
|
|
+ "metadata": {
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "subslide"
|
|
|
+ }
|
|
|
+ },
|
|
|
"source": [
|
|
|
"Above we have used the `.T` to transpose the matrix object `v`. We could also have used the `transpose` function to accomplish the same thing. \n",
|
|
|
"\n",
|
|
@@ -908,7 +942,10 @@
|
|
|
"cell_type": "code",
|
|
|
"execution_count": 56,
|
|
|
"metadata": {
|
|
|
- "collapsed": false
|
|
|
+ "collapsed": false,
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "subslide"
|
|
|
+ }
|
|
|
},
|
|
|
"outputs": [
|
|
|
{
|
|
@@ -1006,7 +1043,10 @@
|
|
|
"cell_type": "code",
|
|
|
"execution_count": 58,
|
|
|
"metadata": {
|
|
|
- "collapsed": false
|
|
|
+ "collapsed": false,
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "fragment"
|
|
|
+ }
|
|
|
},
|
|
|
"outputs": [
|
|
|
{
|
|
@@ -1029,7 +1069,10 @@
|
|
|
"cell_type": "code",
|
|
|
"execution_count": 59,
|
|
|
"metadata": {
|
|
|
- "collapsed": false
|
|
|
+ "collapsed": false,
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "fragment"
|
|
|
+ }
|
|
|
},
|
|
|
"outputs": [
|
|
|
{
|
|
@@ -1063,7 +1106,10 @@
|
|
|
"cell_type": "code",
|
|
|
"execution_count": 60,
|
|
|
"metadata": {
|
|
|
- "collapsed": false
|
|
|
+ "collapsed": false,
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "fragment"
|
|
|
+ }
|
|
|
},
|
|
|
"outputs": [
|
|
|
{
|
|
@@ -1085,7 +1131,10 @@
|
|
|
"cell_type": "code",
|
|
|
"execution_count": 61,
|
|
|
"metadata": {
|
|
|
- "collapsed": false
|
|
|
+ "collapsed": false,
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "fragment"
|
|
|
+ }
|
|
|
},
|
|
|
"outputs": [
|
|
|
{
|
|
@@ -1116,7 +1165,11 @@
|
|
|
},
|
|
|
{
|
|
|
"cell_type": "markdown",
|
|
|
- "metadata": {},
|
|
|
+ "metadata": {
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "subslide"
|
|
|
+ }
|
|
|
+ },
|
|
|
"source": [
|
|
|
"The shape of an Numpy array can be modified without copying the underlaying data, which makes it a fast operation even for large arrays."
|
|
|
]
|
|
@@ -1125,7 +1178,10 @@
|
|
|
"cell_type": "code",
|
|
|
"execution_count": 65,
|
|
|
"metadata": {
|
|
|
- "collapsed": false
|
|
|
+ "collapsed": false,
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "fragment"
|
|
|
+ }
|
|
|
},
|
|
|
"outputs": [
|
|
|
{
|
|
@@ -1247,7 +1303,11 @@
|
|
|
},
|
|
|
{
|
|
|
"cell_type": "markdown",
|
|
|
- "metadata": {},
|
|
|
+ "metadata": {
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "slide"
|
|
|
+ }
|
|
|
+ },
|
|
|
"source": [
|
|
|
"### Flattening"
|
|
|
]
|
|
@@ -1260,12 +1320,12 @@
|
|
|
}
|
|
|
},
|
|
|
"source": [
|
|
|
- "We can also use the function `flatten` to make a higher-dimensional array into a vector. But this function create a copy of the data."
|
|
|
+ "### `np.ravel`"
|
|
|
]
|
|
|
},
|
|
|
{
|
|
|
"cell_type": "code",
|
|
|
- "execution_count": 70,
|
|
|
+ "execution_count": 98,
|
|
|
"metadata": {
|
|
|
"collapsed": false,
|
|
|
"slideshow": {
|
|
@@ -1276,24 +1336,22 @@
|
|
|
{
|
|
|
"data": {
|
|
|
"text/plain": [
|
|
|
- "array([ 5, 5, 5, 5, 5, 10, 11, 12, 13, 14, 20, 21, 22, 23, 24, 30, 31,\n",
|
|
|
- " 32, 33, 34, 40, 41, 42, 43, 44])"
|
|
|
+ "array([1, 2, 3, 4, 5, 6])"
|
|
|
]
|
|
|
},
|
|
|
- "execution_count": 70,
|
|
|
+ "execution_count": 98,
|
|
|
"metadata": {},
|
|
|
"output_type": "execute_result"
|
|
|
}
|
|
|
],
|
|
|
"source": [
|
|
|
- "B = A.flatten()\n",
|
|
|
- "\n",
|
|
|
- "B"
|
|
|
+ "a = np.array([[1, 2, 3], [4, 5, 6]])\n",
|
|
|
+ "a.ravel()"
|
|
|
]
|
|
|
},
|
|
|
{
|
|
|
"cell_type": "code",
|
|
|
- "execution_count": 71,
|
|
|
+ "execution_count": 99,
|
|
|
"metadata": {
|
|
|
"collapsed": false,
|
|
|
"slideshow": {
|
|
@@ -1304,124 +1362,139 @@
|
|
|
{
|
|
|
"data": {
|
|
|
"text/plain": [
|
|
|
- "array([10, 10, 10, 10, 10, 10, 11, 12, 13, 14, 20, 21, 22, 23, 24, 30, 31,\n",
|
|
|
- " 32, 33, 34, 40, 41, 42, 43, 44])"
|
|
|
+ "array([[1, 4],\n",
|
|
|
+ " [2, 5],\n",
|
|
|
+ " [3, 6]])"
|
|
|
]
|
|
|
},
|
|
|
- "execution_count": 71,
|
|
|
+ "execution_count": 99,
|
|
|
"metadata": {},
|
|
|
"output_type": "execute_result"
|
|
|
}
|
|
|
],
|
|
|
"source": [
|
|
|
- "B[0:5] = 10\n",
|
|
|
- "\n",
|
|
|
- "B"
|
|
|
+ "a.T"
|
|
|
]
|
|
|
},
|
|
|
{
|
|
|
"cell_type": "code",
|
|
|
- "execution_count": 72,
|
|
|
+ "execution_count": 100,
|
|
|
"metadata": {
|
|
|
"collapsed": false,
|
|
|
"slideshow": {
|
|
|
- "slide_type": "fragment"
|
|
|
+ "slide_type": "subslide"
|
|
|
}
|
|
|
},
|
|
|
"outputs": [
|
|
|
{
|
|
|
"data": {
|
|
|
"text/plain": [
|
|
|
- "array([[ 5, 5, 5, 5, 5],\n",
|
|
|
- " [10, 11, 12, 13, 14],\n",
|
|
|
- " [20, 21, 22, 23, 24],\n",
|
|
|
- " [30, 31, 32, 33, 34],\n",
|
|
|
- " [40, 41, 42, 43, 44]])"
|
|
|
+ "array([1, 4, 2, 5, 3, 6])"
|
|
|
]
|
|
|
},
|
|
|
- "execution_count": 72,
|
|
|
+ "execution_count": 100,
|
|
|
"metadata": {},
|
|
|
"output_type": "execute_result"
|
|
|
}
|
|
|
],
|
|
|
"source": [
|
|
|
- "A # now A has not changed, because B's data is a copy of A's, not refering to the same data"
|
|
|
+ "a.T.ravel()"
|
|
|
]
|
|
|
},
|
|
|
{
|
|
|
"cell_type": "markdown",
|
|
|
- "metadata": {},
|
|
|
+ "metadata": {
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "subslide"
|
|
|
+ }
|
|
|
+ },
|
|
|
"source": [
|
|
|
- "### `np.ravel`"
|
|
|
+ "We can also use the function `flatten` to make a higher-dimensional array into a vector. But this function create a copy of the data."
|
|
|
]
|
|
|
},
|
|
|
{
|
|
|
"cell_type": "code",
|
|
|
- "execution_count": 98,
|
|
|
+ "execution_count": 70,
|
|
|
"metadata": {
|
|
|
- "collapsed": false
|
|
|
+ "collapsed": false,
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "fragment"
|
|
|
+ }
|
|
|
},
|
|
|
"outputs": [
|
|
|
{
|
|
|
"data": {
|
|
|
"text/plain": [
|
|
|
- "array([1, 2, 3, 4, 5, 6])"
|
|
|
+ "array([ 5, 5, 5, 5, 5, 10, 11, 12, 13, 14, 20, 21, 22, 23, 24, 30, 31,\n",
|
|
|
+ " 32, 33, 34, 40, 41, 42, 43, 44])"
|
|
|
]
|
|
|
},
|
|
|
- "execution_count": 98,
|
|
|
+ "execution_count": 70,
|
|
|
"metadata": {},
|
|
|
"output_type": "execute_result"
|
|
|
}
|
|
|
],
|
|
|
"source": [
|
|
|
- "a = np.array([[1, 2, 3], [4, 5, 6]])\n",
|
|
|
- "a.ravel()"
|
|
|
+ "B = A.flatten()\n",
|
|
|
+ "\n",
|
|
|
+ "B"
|
|
|
]
|
|
|
},
|
|
|
{
|
|
|
"cell_type": "code",
|
|
|
- "execution_count": 99,
|
|
|
+ "execution_count": 71,
|
|
|
"metadata": {
|
|
|
- "collapsed": false
|
|
|
+ "collapsed": false,
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "subslide"
|
|
|
+ }
|
|
|
},
|
|
|
"outputs": [
|
|
|
{
|
|
|
"data": {
|
|
|
"text/plain": [
|
|
|
- "array([[1, 4],\n",
|
|
|
- " [2, 5],\n",
|
|
|
- " [3, 6]])"
|
|
|
+ "array([10, 10, 10, 10, 10, 10, 11, 12, 13, 14, 20, 21, 22, 23, 24, 30, 31,\n",
|
|
|
+ " 32, 33, 34, 40, 41, 42, 43, 44])"
|
|
|
]
|
|
|
},
|
|
|
- "execution_count": 99,
|
|
|
+ "execution_count": 71,
|
|
|
"metadata": {},
|
|
|
"output_type": "execute_result"
|
|
|
}
|
|
|
],
|
|
|
"source": [
|
|
|
- "a.T"
|
|
|
+ "B[0:5] = 10\n",
|
|
|
+ "\n",
|
|
|
+ "B"
|
|
|
]
|
|
|
},
|
|
|
{
|
|
|
"cell_type": "code",
|
|
|
- "execution_count": 100,
|
|
|
+ "execution_count": 72,
|
|
|
"metadata": {
|
|
|
- "collapsed": false
|
|
|
+ "collapsed": false,
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "fragment"
|
|
|
+ }
|
|
|
},
|
|
|
"outputs": [
|
|
|
{
|
|
|
"data": {
|
|
|
"text/plain": [
|
|
|
- "array([1, 4, 2, 5, 3, 6])"
|
|
|
+ "array([[ 5, 5, 5, 5, 5],\n",
|
|
|
+ " [10, 11, 12, 13, 14],\n",
|
|
|
+ " [20, 21, 22, 23, 24],\n",
|
|
|
+ " [30, 31, 32, 33, 34],\n",
|
|
|
+ " [40, 41, 42, 43, 44]])"
|
|
|
]
|
|
|
},
|
|
|
- "execution_count": 100,
|
|
|
+ "execution_count": 72,
|
|
|
"metadata": {},
|
|
|
"output_type": "execute_result"
|
|
|
}
|
|
|
],
|
|
|
"source": [
|
|
|
- "a.T.ravel()"
|
|
|
+ "A # now A has not changed, because B's data is a copy of A's, not refering to the same data"
|
|
|
]
|
|
|
},
|
|
|
{
|
|
@@ -1437,7 +1510,11 @@
|
|
|
},
|
|
|
{
|
|
|
"cell_type": "markdown",
|
|
|
- "metadata": {},
|
|
|
+ "metadata": {
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "subslide"
|
|
|
+ }
|
|
|
+ },
|
|
|
"source": [
|
|
|
"With `newaxis`, we can insert new dimensions in an array, for example converting a vector to a column or row matrix:"
|
|
|
]
|
|
@@ -1574,7 +1651,11 @@
|
|
|
},
|
|
|
{
|
|
|
"cell_type": "markdown",
|
|
|
- "metadata": {},
|
|
|
+ "metadata": {
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "subslide"
|
|
|
+ }
|
|
|
+ },
|
|
|
"source": [
|
|
|
"Using function `repeat`, `tile`, `vstack`, `hstack`, and `concatenate` we can create larger vectors and matrices from smaller ones:"
|
|
|
]
|
|
@@ -1594,7 +1675,10 @@
|
|
|
"cell_type": "code",
|
|
|
"execution_count": 82,
|
|
|
"metadata": {
|
|
|
- "collapsed": false
|
|
|
+ "collapsed": false,
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "fragment"
|
|
|
+ }
|
|
|
},
|
|
|
"outputs": [],
|
|
|
"source": [
|
|
@@ -1671,7 +1755,7 @@
|
|
|
"metadata": {
|
|
|
"collapsed": false,
|
|
|
"slideshow": {
|
|
|
- "slide_type": "-"
|
|
|
+ "slide_type": "fragment"
|
|
|
}
|
|
|
},
|
|
|
"outputs": [],
|
|
@@ -1747,7 +1831,10 @@
|
|
|
"cell_type": "code",
|
|
|
"execution_count": 88,
|
|
|
"metadata": {
|
|
|
- "collapsed": false
|
|
|
+ "collapsed": false,
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "fragment"
|
|
|
+ }
|
|
|
},
|
|
|
"outputs": [
|
|
|
{
|
|
@@ -1771,7 +1858,10 @@
|
|
|
"cell_type": "code",
|
|
|
"execution_count": 89,
|
|
|
"metadata": {
|
|
|
- "collapsed": false
|
|
|
+ "collapsed": false,
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "fragment"
|
|
|
+ }
|
|
|
},
|
|
|
"outputs": [
|
|
|
{
|
|
@@ -1803,7 +1893,11 @@
|
|
|
},
|
|
|
{
|
|
|
"cell_type": "markdown",
|
|
|
- "metadata": {},
|
|
|
+ "metadata": {
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "subslide"
|
|
|
+ }
|
|
|
+ },
|
|
|
"source": [
|
|
|
"To achieve high performance, assignments in Python usually do not copy the underlaying objects. \n",
|
|
|
"\n",
|
|
@@ -1816,7 +1910,10 @@
|
|
|
"cell_type": "code",
|
|
|
"execution_count": 90,
|
|
|
"metadata": {
|
|
|
- "collapsed": false
|
|
|
+ "collapsed": false,
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "subslide"
|
|
|
+ }
|
|
|
},
|
|
|
"outputs": [
|
|
|
{
|
|
@@ -1843,7 +1940,7 @@
|
|
|
"metadata": {
|
|
|
"collapsed": false,
|
|
|
"slideshow": {
|
|
|
- "slide_type": "subslide"
|
|
|
+ "slide_type": "fragment"
|
|
|
}
|
|
|
},
|
|
|
"outputs": [],
|
|
@@ -1989,14 +2086,22 @@
|
|
|
},
|
|
|
{
|
|
|
"cell_type": "markdown",
|
|
|
- "metadata": {},
|
|
|
+ "metadata": {
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "slide"
|
|
|
+ }
|
|
|
+ },
|
|
|
"source": [
|
|
|
"# Exercise: Shape manipulations"
|
|
|
]
|
|
|
},
|
|
|
{
|
|
|
"cell_type": "markdown",
|
|
|
- "metadata": {},
|
|
|
+ "metadata": {
|
|
|
+ "slideshow": {
|
|
|
+ "slide_type": "subslide"
|
|
|
+ }
|
|
|
+ },
|
|
|
"source": [
|
|
|
"* Look at the docstring for `reshape`, especially the notes section which\n",
|
|
|
"has some more information about copies and views.\n",
|
|
@@ -2009,6 +2114,7 @@
|
|
|
}
|
|
|
],
|
|
|
"metadata": {
|
|
|
+ "celltoolbar": "Slideshow",
|
|
|
"kernelspec": {
|
|
|
"display_name": "Python 3",
|
|
|
"language": "python",
|