{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# NumPy\n", "\n", "Credits: Forked from [Parallel Machine Learning with scikit-learn and IPython](https://github.com/ogrisel/parallel_ml_tutorial) by Olivier Grisel\n", "\n", "* NumPy Arrays, dtype, and shape\n", "* Common Array Operations\n", "* Reshape and Update In-Place\n", "* Combine Arrays\n", "* Create Sample Data" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## NumPy Arrays, dtypes, and shapes" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1 2 3]\n", "(3,)\n", "int64\n" ] } ], "source": [ "a = np.array([1, 2, 3])\n", "print(a)\n", "print(a.shape)\n", "print(a.dtype)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 2 4]\n", " [1 3 5]]\n", "(2, 3)\n", "int64\n" ] } ], "source": [ "b = np.array([[0, 2, 4], [1, 3, 5]])\n", "print(b)\n", "print(b.shape)\n", "print(b.dtype)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0., 0., 0., 0., 0.])" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.zeros(5)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1, 1, 1, 1],\n", " [1, 1, 1, 1],\n", " [1, 1, 1, 1]], dtype=int32)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.ones(shape=(3, 4), dtype=np.int32)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Common Array Operations" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0. 1. 2. ]\n", " [0.5 1.5 2.5]]\n", "(2, 3)\n", "float64\n" ] } ], "source": [ "c = b * 0.5\n", "print(c)\n", "print(c.shape)\n", "print(c.dtype)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1. 3. 5. ]\n", " [1.5 3.5 5.5]]\n" ] } ], "source": [ "d = a + c\n", "print(d)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1., 3., 5.])" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d[0]" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.0" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d[0, 0]" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1. , 1.5])" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d[:, 0]" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "19.5" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d.sum()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3.25" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d.mean()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 2.5, 6.5, 10.5])" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d.sum(axis=0)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([3. , 3.5])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d.mean(axis=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Reshape and Update In-Place" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0 1 2 3 4 5 6 7 8 9 10 11]\n" ] } ], "source": [ "e = np.arange(12)\n", "print(e)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 0 1 2 3]\n", " [ 4 5 6 7]\n", " [ 8 9 10 11]]\n" ] } ], "source": [ "# f is a view of contents of e\n", "f = e.reshape(3, 4)\n", "print(f)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 1 2 3 4 0 0 0 0 0 0 0]\n" ] } ], "source": [ "# Set values of e from index 5 onwards to 0\n", "e[5:] = 0\n", "print(e)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0, 1, 2, 3],\n", " [4, 0, 0, 0],\n", " [0, 0, 0, 0]])" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# f is also updated\n", "f" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ " C_CONTIGUOUS : True\n", " F_CONTIGUOUS : False\n", " OWNDATA : False\n", " WRITEABLE : True\n", " ALIGNED : True\n", " WRITEBACKIFCOPY : False\n", " UPDATEIFCOPY : False" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# OWNDATA shows f does not own its data\n", "f.flags" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Combine Arrays" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 2, 3])" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0, 2, 4],\n", " [1, 3, 5]])" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1. , 3. , 5. ],\n", " [1.5, 3.5, 5.5]])" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 2, 3, 1, 2, 3, 1, 2, 3])" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.concatenate([a, a, a])" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1. , 2. , 3. ],\n", " [0. , 2. , 4. ],\n", " [1. , 3. , 5. ],\n", " [1. , 3. , 5. ],\n", " [1.5, 3.5, 5.5]])" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Use broadcasting when needed to do this automatically\n", "np.vstack([a, b, d])" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0. , 2. , 4. , 1. , 3. , 5. ],\n", " [1. , 3. , 5. , 1.5, 3.5, 5.5]])" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# In machine learning, useful to enrich or \n", "# add new/concatenate features with hstack\n", "np.hstack([b, d])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Create Sample Data" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "\n", "import pylab as plt\n", "import seaborn\n", "\n", "seaborn.set()" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Create evenly spaced numbers over the specified interval\n", "x = np.linspace(0, 2, 10)\n", "plt.plot(x, 'o-');\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "image/png": "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vLw8+XNFRQXa29vzOKLsMH78+OS/Dx8+jB07duDee+9Nm/vJkyfzMbys8fjjj2PFihU4ceIEgPTrXV5eXnBzPnLkCNxuN5YvX44TJ06grq4O48ePL/hrXVJSgh/96Eeor6+Hz+fDjTfeCLfbXZDX+8knnxzxs5SOnTx50tD73RQWdiKRAMddKCnI8/yInwuNTz/9FEuXLsWjjz6KcePGFfTcX3/9dVx66aUIBALJ39nhesfjcQSDQTz11FP4wx/+gPb2dhw9erTg593d3Y0//vGP2LNnD9577z04HA60tbUV/LwB+fvayPvdFBZ2ZWUlPvjgg+TPfX19ydeMQuPAgQN4+OGH8dhjj6GxsRHvv/8++vr6kn8vtLlv374dfX19uPPOO/H111/j/Pnz4DhuxJy/+uqrgpozAFx88cUIBAK46KKLAAC33347du7cCafTmdym0K41AOzbtw+BQAB+vx/A8Ov/hg0bCv56A8M6JvVdTv19JvM3hYV96623IhgM4tSpUwiHw3jnnXdw22235XtYhnPixAk8+OCDeO6559DY2AgAuP766/H555/jyJEjiMfj2LZtW0HNfdOmTdi2bRveeustPPzww5g5cyZ+9atfwev14sCBAwCGowoKac4AMGPGDOzbtw/9/f2Ix+N47733MGfOnIK+1gBQXV2N/fv34/z58+B5Hrt378ZNN91U8NcbkP8uf/vb3zZs/qawsC+55BKsWLECixcvRjQaxYIFCzB58uR8D8twNmzYgEgkgjVr1iR/d/fdd2PNmjV46KGHEIlEUFtbizlz5uRxlLnhueeew+rVqzEwMICamhosXrw430MylOuvvx73338/7rnnHkSjUUybNg0LFy7E1VdfXdDXevr06ejs7ERzczPcbjcmTZqEH/zgB7jjjjsK+noDgNfrlf0uG3W/U8cZgiAIi2AKlwhBEAShDgk2QRCERSDBJgiCsAgk2ARBEBaBBJsgCMIikGATBEFYBBJsgiAIi0CCTRAEYRH+PwlNNEgLN9UoAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Create sample data, add some noise\n", "x = np.random.uniform(1, 100, 1000)\n", "y = np.log(x) + np.random.normal(0, .3, 1000)\n", "\n", "plt.scatter(x, y)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Softmax Function Explanation - Super basics " ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 5],\n", " [ 2],\n", " [-1],\n", " [ 3]])" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "ZL = np.array([[5],[2],[-1],[3]])\n", "ZL" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[148.4131591 ],\n", " [ 7.3890561 ],\n", " [ 0.36787944],\n", " [ 20.08553692]])" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "t = np.exp(ZL)\n", "t" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "176.25563156586637" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# sum of ti and this we do by normalizing thse entries, lets add them up\n", "np.sum(t)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0.84203357],\n", " [0.04192238],\n", " [0.00208719],\n", " [0.11395685]])" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "AL = t / np.sum(t)\n", "AL" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "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.8.3" } }, "nbformat": 4, "nbformat_minor": 1 }