{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "1. Theano\n", " \n", " (1) Theano\n", " \n", " Theano is a Python library that allows you to define, optimize, and evaluate mathematical expressions involving multi-dimensional arrays efficiently. \n", " \n", " Theano features:\n", " \n", " - tight integration with NumPy – Use numpy.ndarray in Theano-compiled functions.\n", " - transparent use of a GPU – Perform data-intensive calculations up to 140x faster than with CPU.(float32 only)\n", " - efficient symbolic differentiation – Theano does your derivatives for function with one or many inputs.\n", " - speed and stability optimizations – Get the right answer for log(1+x) even when x is really tiny.\n", " - dynamic C code generation – Evaluate expressions faster.\n", " - extensive unit-testing and self-verification – Detect and diagnose many types of mistake.\n", " \n", " Theano has been powering large-scale computationally intensive scientific investigations since 2007. But it is also approachable enough to be used in the classroom\n", " \n", " (2) Install\n", " \n", " Basic user install instructions\n", " \n", " pip install Theano OR pip install Theano --user\n", " \n", " update\n", " \n", " sudo pip install --upgrade --no-deps theano\n", " \n", " The following command will update Theano and Numpy/Scipy (warning bellow):\n", " \n", " sudo pip install --upgrade theano\n", "\n", "2. Numpy\n", "\n", " [1] Matrix conventions\n", " \n", " (1) Array Creation\n", " \n", " array()" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 6. , 7.5, 8. , 0. , 1. ])" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "\n", "data1 = [6, 7.5, 8, 0, 1]\n", "\n", "arr1 = np.array(data1)\n", "\n", "arr1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " arrange()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.arange(10)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 2., 3., 4., 5., 6., 7., 8., 9.])" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.arange(2, 10, dtype=np.float)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 2. , 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9])" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.arange(2, 3, 0.1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " indices()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[[0, 0, 0],\n", " [1, 1, 1],\n", " [2, 2, 2]],\n", "\n", " [[0, 1, 2],\n", " [0, 1, 2],\n", " [0, 1, 2]]])" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.indices((3,3))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " (2) Indexing\n", " \n", " single element indexing" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = np.arange(10)\n", "\n", "x[2]\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "8" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x[-2]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "8" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x.shape = (2,5)\n", "x[1,3]" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "9" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x[1,-1]" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([0, 1, 2, 3, 4])" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Other indexing options" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([2, 3, 4])" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = np.arange(10)\n", "x[2:5]" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([0, 1, 2])" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x[:-7]" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([1, 3, 5])" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x[1:7:2]" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 7, 10, 13],\n", " [21, 24, 27]])" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y = np.arange(35).reshape(5,7)\n", "y[1:5:2,::3]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " (3) Index Arrays" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([7, 7, 9, 2])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = np.arange(10,1,-1)\n", "x[np.array([3, 3, 1, 8])]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " It is an error to have index values out of bounds:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "ename": "IndexError", "evalue": "index 20 is out of bounds for size 9", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m<ipython-input-17-3ad16747a54d>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mx\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m20\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m8\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mIndexError\u001b[0m: index 20 is out of bounds for size 9" ] } ], "source": [ " x[np.array([3, 3, 20, 8])]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " (4) Indexing Multi-dimensional arrays" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0, 15, 30])" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y[np.array([0,2,4]), np.array([0,1,2])]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " If the index arrays do not have the same shape, there is an attempt to \n", " broadcast them to the same shape. If they cannot be broadcast to \n", " the same shape, an exception is raised:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "ename": "ValueError", "evalue": "shape mismatch: objects cannot be broadcast to a single shape", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m<ipython-input-19-1a836a248e48>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0my\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mValueError\u001b[0m: shape mismatch: objects cannot be broadcast to a single shape" ] } ], "source": [ "y[np.array([0,2,4]), np.array([0,1])]" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 1, 15, 29])" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y[np.array([0,2,4]), 1]" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 0, 1, 2, 3, 4, 5, 6],\n", " [14, 15, 16, 17, 18, 19, 20],\n", " [28, 29, 30, 31, 32, 33, 34]])" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ " y[np.array([0,2,4])]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " [2] BroadCasting\n", " The term broadcasting describes how numpy treats arrays with different shapes during arithmetic operations. Subject to certain constraints, the smaller array is \n", " “broadcast” across the larger array so that they have compatible shapes\n", " \n", " @Rules\n", " \n", " When operating on two arrays, NumPy compares their shapes element-wise. \n", " It starts with the trailing dimensions, and works its way forward. \n", " Two dimensions are compatible when\n", " \n", " they are equal, or\n", " one of them is 1\n", " \n", " If these conditions are not met, a ValueError: frames are not aligned exception\n", " is thrown, indicating that the arrays have incompatible shapes. \n", " The size of the resulting array is the maximum size along each dimension of the \n", " input arrays.\n", " " ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 2., 4., 6.])" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = np.array([1.0, 2.0, 3.0])\n", "b = np.array([2.0, 2.0, 2.0])\n", "a * b" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " Two Dimensions are not compatible ( x is (4,) , y is (5,) )" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "ename": "ValueError", "evalue": "operands could not be broadcast together with shapes (4,) (5,) ", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m<ipython-input-24-f7f60ee3cd0e>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mz\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mones\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mx\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mValueError\u001b[0m: operands could not be broadcast together with shapes (4,) (5,) " ] } ], "source": [ "x = np.arange(4)\n", "xx = x.reshape(4,1)\n", "y = np.ones(5)\n", "z = np.ones((3,4))\n", "\n", "x + y" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 1., 1., 1., 1., 1.],\n", " [ 2., 2., 2., 2., 2.],\n", " [ 3., 3., 3., 3., 3.],\n", " [ 4., 4., 4., 4., 4.]])" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "xx + y" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 1., 2., 3., 4.],\n", " [ 1., 2., 3., 4.],\n", " [ 1., 2., 3., 4.]])" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x + z" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(3, 4)" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(x + z).shape" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.6" } }, "nbformat": 4, "nbformat_minor": 0 }