Skip to content

Instantly share code, notes, and snippets.

@sriharsha0806
Created September 18, 2016 18:07
Show Gist options
  • Save sriharsha0806/a33d94672f9423cac5cf4d2e7d8bf91b to your computer and use it in GitHub Desktop.
Save sriharsha0806/a33d94672f9423cac5cf4d2e7d8bf91b to your computer and use it in GitHub Desktop.
{
"cells": [
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7efc296b57b8>]"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAX8AAAEACAYAAABbMHZzAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XeYVdW9xvHvj6aowQKKDVEsaFARYkEsjIBIBwEDKsYW\nS4oxJjFibnLh5iZRk2ByjYlEY0EioijIgCBFHIxYQLGA0pRuAUWNRMAMzLp/rJmIOsOUs89Zu7yf\n55nHmcOZvd85nvnN2muvYs45REQkW+qFDiAiIoWn4i8ikkEq/iIiGaTiLyKSQSr+IiIZpOIvIpJB\nkRR/M7vbzNab2Ws7ec5tZrbczF4xsxOiOK+IiNRNVC3/e4FzqvpHM+sBHO6cOxK4ChgV0XlFRKQO\nIin+zrlngI928pR+wP3lz30B2NPMmkdxbhERqb1C9fkfBKzd4eu3yx8TEZEAdMNXRCSDGhToPG8D\nLXb4+uDyx77CzLTYkIhILTnnrDbPj7Llb+UflSkGvgVgZh2Aj51z66s6kHMuMR8bNjh69nS0b+8Y\nN87x2Wc7f/7SpY7u3R1HH+2YOXPnzx0+fHjwny8OH3od0v9abN/uuO02R9Omjptvdrz//s6f/8kn\njm7dhtO0qeO3v3WUlob/GUJ+1EVUQz3HAs8CR5nZGjO71MyuMrMry4v5VGClmb0J/BX4bhTnDW32\nbGjXDo47Dp5/HgYPhkaNdv49Rx0FU6fCLbfAFVfAj38MZWWFySsSR2vWQNeu8OCD8OyzcMMN0KzZ\nzr/na1+DU0+FefNg+nTo0AFWrChM3rSIpNvHOXdBDZ7z/SjOFRd/+hPcdBOMHg1nn1277zWDvn3h\njDOgd2+45BK4+25o2DAvUUVia8UKOOssuPJKGDYM6tev3fe3agUzZ8Jtt0FREcya5RtYUj3d8K2D\nu+6CkSN9a7+2hX9He+/t37gffAADBsCWLV/896KiopxypoVeh8+l6bV46y1f+IcNg//6r9oX/orX\nwgyuvRZGjPDHe+ONyKOmktW1vyhfzMzFLdOOxo6F66+HkhI48shojllaCpdeCuvXw7Rp0KBQt+FF\nAnnrLejcGW68Ea6+Orrj/v3v/vdz+nQ4/vjojht3Zoar5Q1fFf9amDQJrrrKX1oee2y0x96+3XcB\ntW4Nf/xjtMcWiZMPP4QTT4Sf/jTawl/hwQf9fYOXXoJ9943++HGk4p9HS5fCaaf5lvlJJ+XnHB99\nBKec4ltDl16an3OIhFRW5u93tW7tu07z5cYbYf58fwVQ2+6kJFLxz5OtW/1ogquvzk9LZUeLF0On\nTlBc7M8pkiY33wyTJ/tu03wOcNi2Dbp3h5NPht/8Jn/niQsV/zy55hp4910YP97fXMq3yZPhO9+B\nV1+Fpk3zfz6RQigpgSFD4MUX4eCD83++99+Hb3zDj8zr1y//5wtJxT8PHnsMrrsOXn4Z9tqrcOe9\n7jo/CmjMmMKdUyRfNmzwc2LuvRe6dSvceV94Afr0gVdegQMPLNx5C03FP2LvvQdt2/obvYXugvn0\nUz957PbboWfPwp5bJGoXXQTNm8Pvf1/4c//857BkCTzySOHPXSgq/hEbOtRfnt58c5jzP/mkv/G7\naBE0aRImg0iunnwSLr8cXn8ddt+98OffutUP+xw50l8FpJGKf4TmzPGtlcWLw7xhK1xxhR/3f8cd\n4TKI1FVcCu/s2X4m/euv+6Uh0kbFPyKlpb5/8n/+BwYODBqFjz/2cwrGjoUzzwybRaS2RoyA116D\nCRNCJ/FX0Xvumc55NCr+Efn97/1ErmnTCjO6pzrjxvlM8+ZBPS3IIQlRMTfmlVcKM7qnOhs3Qps2\nfmHF9u1Dp4mWin8E1q2DE06A556LbvmGXJWV+RvO110H558fOo1IzfTp4xdb+/GPQyf53F//6ods\nz5oVOkm0VPwjcNllsP/+8ZsYMmeO77NcsgR22SV0GpGdmzsXLrgAli2L1/u1tNS3/v/859wWZYwb\nFf8cLVvmL1OXLy/smP6a6tvXt6R+9KPQSUSq5pyfpX7ZZb7BEjcPP+z305g/Pz3dqHUp/in50aMx\nYoTvWolj4Qc/5PTmm/0aQCJx9cQTfoLiRReFTlK5QYP8vbw0j/uvCbX8yy1c6C8D33wT9tij4Kev\nsSuv9CMWfve70ElEvqqszC+p8Itf+D0q4mrWLL+EyhtvpGMTJbX8czB8uF9iNs6FH3zOu+/265aI\nxM348b6Ynntu6CQ717UrHHqo/13KKrX88et+9+3rW/2NGxf01HVy9dV+j9Nf/Sp0EpHPbd8OX/86\n/OUv0KVL6DTVmzfPdwG99VbyW/9q+dfRf/+330YuCYUf/BXKqFHwz3+GTiLyuYkT/Sq0nTuHTlIz\nJ5/sh3M/+GDoJGFkvvgvXOhX7Lz88tBJaq5VK79WuZZ8kLhwzo+g+elP4zExsqaGDfO5y8pCJym8\nzBf/kSP9ev1xGotcEzfe6Kepb94cOomIX6t/0ybffZokXbvCrrvC44+HTlJ4mS7+b7/td8zK9+5c\n+dCmDZx6arZvWEl83HKL3zg9aePmzfx+vzfd5K9esiTTN3xvuAE++yy5Cz3Nn+8XnnvzTWjUKHQa\nyapXXoFevWDFiuRdQYO/Ud26td9o5owzQqepG93wrYVPPoG//Q1++MPQSerupJPgiCPisWKiZNdv\nf+t/j5JY+MFv8P7Tn4bbtyOUzLb8b73Vt5yTfqd/4kQ/4evZZ0MnkSxatcpP6lqxwk8+TKqtW/24\n/6eegmOOCZ2m9tTyr6HSUt/V85OfhE6Suz59/L2Ll14KnUSy6I474OKLk134wd/0veIKP0chKzLZ\n8h8/3u+NO2dOXk9TML/9rZ+mft99oZNIlmzdCi1a+KvOuCx/not16/yuY6tXJ2+3L7X8a+iOO+C7\n3w2dIjqXX+43md+wIXQSyZKHHvJdPmko/OA3nOncGcaMCZ2kMDJX/Jcs8fvyxn3tkdpo2tSP+rnr\nrtBJJEv+8hf43vdCp4jW977n1/qPWYdIXmSu+I8a5dcZT9vQyGuu8Vc0paWhk0gWvPgirF8PPXuG\nThKtoiL/35KSkCkKI1PFf/Nmf0l35ZWhk0SvbVs4/HB47LHQSSQL/vxnPzmyfv3QSaJl9nnrP+0y\ndcP3nnv8mPgpU/Jy+ODGjfM/44wZoZNImm3c6OeXLFsG++4bOk30Nm2Cli3h1Vf9De0k0A3fatxx\nh9/AIa3694cFC2DlytBJJM3uu88PMU5j4Qc/0ueCC9K/dEpmiv+LL/oNULp3D50kf3bdFS680E9T\nF8kH5/zM+DR2ne7o8sv9H7k0r/aZmeJ/113+DZu2Psovu/xyX/y3bw+dRNLo+ed9QTzttNBJ8qtd\nO9h7b5g9O3SS/MlE8d+82U/suvji0Eny7/jj4cAD1e8v+XHPPXDppclas7+uLrvM/7xplYkbvg88\n4Ef5PPFEpIeNrTvvhOnT4dFHQyeRNPn0Uz8R6vXXfQMj7T780G+ctHKlvwqIM93wrcJ99/nWSlYM\nGeIvV9evD51E0uTRR313TxYKP8A++/h7hGPHhk6SH6kv/mvW+BEw/fqFTlI4TZr4GcxZmaYuhXHP\nPb4rJEsuvzy9XT+pL/733w+DB/uRMFlS8aaNWa+eJNSbb/rFA3v3Dp2ksDp3hg8+8BvWpE2qi79z\n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\nRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7efc2b996a58>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"x = np.arange(0,3*np.pi,0.1)\n",
"y = np.sin(x)\n",
"#plot the points using matplotlib\n",
"plt.plot(x,y)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7efc290e1550>"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nnEvKfwE4bo/iU/5XKwAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7efc2963f320>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"y_cos = np.cos(x)\n",
"y_sin = np.sin(x)\n",
"# plot the points using matplotlib\n",
"plt.plot(x, y_sin)\n",
"plt.plot(x,y_cos)\n",
"plt.xlabel('x axis label')\n",
"plt.ylabel('y axis label')\n",
"plt.title('Sine and Cosine')\n",
"plt.legend(['Sine','Cosine'])"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[6 7]]\n"
]
}
],
"source": [
"import numpy as np\n",
"# Create the following ranl 2 array with shape (3,4)\n",
"# [[1 2 3 4]\n",
"# [5 6 7 8]\n",
"# [9 10 11 12]]\n",
"a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])\n",
"# Use slicing to pull out the subsisdiary consisting of the first 2 rows\n",
"# and columns 1 and 2; b is the following array of shape (2,2):\n",
"# [[2,3]\n",
"# [6,7]]\n",
"b = a[1:2,1:3] # The slicing operation is a little bit weird for matlab user\n",
"print(b)\n"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'numpy.ndarray'> (3,) 1 2 3\n",
"[5 2 3]\n"
]
}
],
"source": [
"# Arrays \n",
"a= np.array([1,2,3]) # Create a rank 1 array\n",
"print(type(a), a.shape,a[0],a[1],a[2])\n",
"a[0] = 5\n",
"print(a)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[1 2 3]\n",
" [4 5 6]]\n"
]
}
],
"source": [
"b = np.array([[1,2,3],[4,5,6]]) #Create a rank 2 array\n",
"print(b)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(2, 3)\n",
"1 2 4\n"
]
}
],
"source": [
"print(b.shape)\n",
"print(b[0,0],b[0,1],b[1,0])"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 0. 0.]\n",
" [ 0. 0.]]\n",
"[[ 1. 1.]]\n",
"[[7 7]\n",
" [7 7]]\n",
"[[ 1. 0.]\n",
" [ 0. 1.]]\n",
"[[ 0.43047958 0.51013667]\n",
" [ 0.3149202 0.27680466]]\n"
]
}
],
"source": [
"# Numpy also provides many functions to create arrays\n",
"a = np.zeros((2,2)) # Create an array of all zeros\n",
"print(a)\n",
"b = np.ones((1,2)) # Create an array of all ones\n",
"print(b)\n",
"c = np.full((2,2),7,int) # create a constant array\n",
"print(c)\n",
"d = np.eye(2) # Create an array filled with random values\n",
"print(d)\n",
"e = np.random.random((2,2)) # Create an array filled with random values\n",
"print(e)"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[2 3]\n",
" [6 7]]\n"
]
}
],
"source": [
"# Array indexing\n",
"# Numpy offers several ways tp index into arrays\n",
"# slicing: similar to python lists,numpy arrays can be sliced. Since arrays may be multidimensional,\n",
"# You must specify a slice for each dimension of the array:\n",
"import numpy as np\n",
"# Create the following rank 2 array with shape(3,4)\n",
"# [[1,2,3,4]\n",
"# [5,6,7,8]\n",
"# [9,10,11,12]]\n",
"a = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])\n",
"# Use slicing to pull out the subarray of shape(2,2):\n",
"# [[2 3]\n",
"# [6 7]]\n",
"b=a[:2,1:3]\n",
"print(b)"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2\n",
"77\n"
]
}
],
"source": [
"# A slice of array is a view into the same data, so modifying it will modify the original array.\n",
"print(a[0,1])\n",
"b[0,0] = 77 # b[0,0] is the same piece of data as a[0,1]\n",
"print(a[0,1])"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 1 77 3 4]\n",
" [ 5 6 7 8]\n",
" [ 9 10 11 12]]\n",
"[5 6 7 8] (4,)\n",
"[[5 6 7 8]] (1, 4)\n",
"[[5 6 7 8]] (1, 4)\n"
]
}
],
"source": [
"print(a)\n",
"row_r1 = a[1,:] # Rank 1 view of the second row of a \n",
"row_r2 = a[1:2,:] # Rank 2 view of the second row of a \n",
"row_r3 = a[[1],:] # Rank 3 view of the third row of a\n",
"print(row_r1, row_r1.shape)\n",
"print(row_r2, row_r2.shape)\n",
"print(row_r3, row_r3.shape)"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[77 6 10] (3,)\n",
"[[77]\n",
" [ 6]\n",
" [10]] (3, 1)\n"
]
}
],
"source": [
"# Two ways of accessing the data in the middle row of the array. Mixing integer indexing with slices yields an\n",
"# array of lower rank, while using only slices yields an array of the same rank as the original array:\n",
"col_r1 = a[:,1]\n",
"col_r2 = a[:,1:2]\n",
"print(col_r1, col_r1.shape)\n",
"print(col_r2,col_r2.shape)"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[2 2]\n"
]
}
],
"source": [
"# integer array indexing: when you index into numpy arrays using slicing, the resulting array view will always be \n",
"# a subarray of the original array. In contrast, integer array indexing allows you to construct arbitrary arrays\n",
"# using the data from another array.\n",
"a = np.array([[1,2],[3,4],[5,6]])\n",
"# An example of integer array indexing.\n",
"# The returned array will have shape (3,) and\n",
"#print([a[0,1,2],a[0,1,0]])\n",
"\n",
"# Equivalent to the previous integer array indexing example\n",
"print(np.array([a[0,1],a[0,1]]))"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "IndexError",
"evalue": "index 3 is out of bounds for axis 0 with size 3",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mIndexError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-39-14ff5fac6145>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;31m# Select one lement from each row of a using the indices in b\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 5\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0marange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m4\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mb\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;31m# prints \"[1,6,7,11]\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;31mIndexError\u001b[0m: index 3 is out of bounds for axis 0 with size 3"
]
}
],
"source": [
"# Create an array of indices\n",
"b = np.array([0, 2, 0, 1])\n",
"\n",
"# Select one lement from each row of a using the indices in b\n",
"print(a[np.arange(4),b]) # prints \"[1,6,7,11]\""
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[False False]\n",
" [ True True]\n",
" [ True True]]\n"
]
}
],
"source": [
"import numpy as no\n",
"a = np.array([[1,2],[3,4],[5,6]])\n",
"bool_idx = (a > 2) # Find the elements of a that are bigger than 2;\n",
" # This returns a numpy array of Booleans of the smae\n",
" # shape as a, where each slot of bool_idx tells\n",
" # Whether that element of a is > 2\n",
"print(bool_idx)"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[3 4 5 6]\n",
"[3 4 5 6]\n"
]
}
],
"source": [
"# We use boolean array indexing to construct a rank 1 array\n",
"# consisting of the elements of a corresponding to the True values\n",
"# of bool_idx\n",
"print(a[bool_idx])\n",
"# We can do all of the above in a single concise statement:\n",
"print (a [a>2])"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"int64 float64 int64\n"
]
}
],
"source": [
"# Datatypes\n",
"# Even numpy array is a grid of elements of the same type. Numpt provides a large set of numeric datatypes that \n",
"# you can use to construct arrays. Numpy tries to guess a datatype when you create an array, but functions that \n",
"# construct arrays. Numpy tries to guess a datatype when you can create an array\n",
"x = np.array([1,2]) # Let numpy choose the datatype\n",
"y = np.array([1.0,2.0]) # Let numy choose the dataype\n",
"z = np.array([1,2],dtype = np.int64) # Force a particular datatype\n",
"print(x.dtype,y.dtype,z.dtype)"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 6. 8.]\n",
" [ 10. 12.]]\n",
"[[ 6. 8.]\n",
" [ 10. 12.]]\n"
]
}
],
"source": [
"x = np.array([[1,2],[3,4]],dtype = np.float64)\n",
"y = np.array([[5,6],[7,8]],dtype = np.float64)\n",
"# Elementwise sum; both produce the array\n",
"print(x+y)\n",
"print(np.add(x,y))"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[-4. -4.]\n",
" [-4. -4.]]\n",
"[[-4. -4.]\n",
" [-4. -4.]]\n"
]
}
],
"source": [
"\n",
"# Elementwise difference; both produce the array\n",
"print(x-y)\n",
"print(np.subtract(x,y))\n"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 5. 12.]\n",
" [ 21. 32.]]\n",
"[[ 5. 12.]\n",
" [ 21. 32.]]\n",
"[[ 0.2 0.33333333]\n",
" [ 0.42857143 0.5 ]]\n",
"[[ 0.2 0.33333333]\n",
" [ 0.42857143 0.5 ]]\n"
]
}
],
"source": [
"# Element product; both produce the array\n",
"print(x*y)\n",
"print(np.multiply(x,y))\n",
"# Element Division; both produce the array\n",
"print(x/y)\n",
"print(np.divide(x,y))"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 1. 1.41421356]\n",
" [ 1.73205081 2. ]]\n"
]
}
],
"source": [
"# Elementwise squareroor; produces the array\n",
"print(np.sqrt(x))"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"219\n",
"219\n",
"[[19 22]\n",
" [43 50]]\n",
"[[19 22]\n",
" [43 50]]\n",
"[[19 22]\n",
" [43 50]]\n",
"[[19 22]\n",
" [43 50]]\n",
"10\n",
"[4 6]\n",
"[3 7]\n"
]
}
],
"source": [
"# NOTE: unlike MATLAB, * is elementwise multiplication, not matrix multiplication. We instead use the dot\n",
"# Function to compute inner products of vectors, to multiply a vector by a matrix, and to multiply matrices. \n",
"x = np.array([[1,2],[3,4]])\n",
"y = np.array([[5,6],[7,8]])\n",
"\n",
"v = np.array([9,10])\n",
"w = np.array([11,12])\n",
"\n",
"#Inner product of vectors; \n",
"print(v.dot(w))\n",
"print(np.dot(v,w))\n",
"\n",
"#Matrix/vector product; Both produce the rank 1 array [29 67]\n",
"print(x.dot(y))\n",
"print(np.dot(x,y))\n",
"\n",
"# Matrix/matrix product; both produce the rank 2 array\n",
"print(x.dot(y))\n",
"print(np.dot(x,y))\n",
"\n",
"x = np.array([[1,2],[3,4]])\n",
"print(np.sum(x)) # Compute sum of all elementsl prints \"10\"\n",
"print(np.sum(x,axis = 0)) # compute sum of each column; prints \"[4 6]\"\n",
"print(np.sum(x,axis = 1)) # compute sum of each row; prints \"[3,7]\"\n"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1 2 3]\n",
"[[1 3]\n",
" [2 4]]\n"
]
}
],
"source": [
"v = np.array([1,2,3])\n",
"print(v)\n",
"print(x.T)"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 2 2 4]\n",
" [ 5 5 7]\n",
" [ 8 8 10]\n",
" [11 11 13]]\n"
]
}
],
"source": [
"# Broadcasting is a powerful mechanism that allows numpy to work with arrays of different shapes when performing\n",
"# arithmetic operations. Frequently we have a smaller army and a larger array, and we want to use the smaller array \n",
"# multiple times to perform some operation on the larger array\n",
"# We will add the vector v to each row of the matrix with same shape as x\n",
"# storing the result in the matrix y\n",
"x = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])\n",
"v = np.array([1,0,1])\n",
"y = np.empty_like(x) # Create an empty matrix with same shape as x\n",
"\n",
"# Add the vector v to each row of the matrix x with an explicit loop\n",
"for i in range(4):\n",
" y[i,:] = x[i,:] + v\n",
"print(y)"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[1 0 1]\n",
" [1 0 1]\n",
" [1 0 1]\n",
" [1 0 1]]\n",
"[[ 2 2 4]\n",
" [ 5 5 7]\n",
" [ 8 8 10]\n",
" [11 11 13]]\n"
]
}
],
"source": [
"# matrix x is very large, computing an explicit loop in python could be slow. Note that adding the vector v to each\n",
"# row of the matrix x is equivalent to forming a matrix vv by stacking multiple copies of v vertically, then \n",
"# performing elementwise summation of x and vv. We could implement this approach like this:\n",
"vv = np.tile(v,(4,1)) # stack 4 copies of v on top of each other\n",
"print(vv) # Prints\"[ [1,0,1]\n",
"# [1,0,1]\n",
"# [1,0,1]\n",
"# [1,0,1]]\"\n",
"y = x + vv # Add x and vv elementwise\n",
"print(y)"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 4 5]\n",
" [ 8 10]\n",
" [12 15]]\n"
]
}
],
"source": [
"# Broadcasting two arrays together follows these rules:\n",
"# 1. If the arrays do not have the same rank, prepend the shape of the lower rank array with 1s until both\n",
"# shapes have the same length\n",
"# 2. The two arrays are said to be compatible in a dimension if they have the same size in the dimension, or if one\n",
"# of the arrays has size 1 in that dimension.\n",
"# 3. The arrays can be broadcast together if they are compatible in all dimensions\n",
"# 4. After broadcasting, each array behaves as if it had shape equal to the elementwise maximum of shapes of the two\n",
"# input arrays\n",
"# 5. In any dimension where one array had size 1 and the other array had size greater than 1, first array behaves as\n",
"# if it were copied along that dimension \n",
"# compute outer product of vectors\n",
"v = np.array([1,2,3]) # v has shape (3,)\n",
"w = np.array([4,5]) # w has shape (2,)\n",
"# To compute an outer product, we first reshape v to be a column\n",
"# vector of shape (3,1); we can then broadcast it against w to yield\n",
"# an output of shape(3,2), which is the outer product of v and w:\n",
"print(np.reshape(v,(3,1))*w)\n"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[2 4 6]\n",
" [5 7 9]]\n"
]
}
],
"source": [
"# Add a vector to each row of a matrix\n",
"x = np.array([[1,2,3],[4,5,6]])\n",
"# X has shape(2,3) and v has shape (3,) so they broadcast to (2,3),\n",
"# giving the following matrix:\n",
"print(x+v)"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 5 6 7]\n",
" [ 9 10 11]]\n"
]
}
],
"source": [
"# Add a vector to each column of a matrix\n",
"# x has shape (2,3) and w has shape (2,).\n",
"# If we transpose x then it has shape (3,2) and can be broadcast\n",
"# against w to yield a result of shape (3,2); transposing this result\n",
"# yields the final result of shape (2,3) which is the matrix x with\n",
"# The vector w added to each column. Gives the following matrix:\n",
"print((x.T + w).T)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python [Root]",
"language": "python",
"name": "Python [Root]"
},
"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.2"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment