01-numpy.md 33.8 KB
 Greg Wilson committed Mar 03, 2014 1 ``````--- `````` Greg Wilson committed Jun 22, 2016 2 3 4 5 ``````title: Analyzing Patient Data teaching: 30 exercises: 0 questions: `````` Greg Wilson committed Jul 01, 2016 6 ``````- "How can I process tabular data files in Python?" `````` Greg Wilson committed Jun 22, 2016 7 8 ``````objectives: - "Explain what a library is, and what libraries are used for." `````` Eilis Hannon committed Oct 20, 2016 9 ``````- "Import a Python library and use the functions it contains." `````` Greg Wilson committed Jun 22, 2016 10 11 12 13 ``````- "Read tabular data from a file into a program." - "Assign values to variables." - "Select individual values and subsections from data." - "Perform operations on arrays of data." `````` Eilis Hannon committed Oct 20, 2016 14 ``````- "Plot simple graphs from data." `````` Greg Wilson committed Jun 22, 2016 15 ``````keypoints: `````` Greg Wilson committed Jun 25, 2016 16 17 18 19 20 21 ``````- "Import a library into a program using `import libraryname`." - "Use the `numpy` library to work with arrays in Python." - "Use `variable = value` to assign a value to a variable in order to record it in memory." - "Variables are created on demand whenever a value is assigned to them." - "Use `print(something)` to display the value of `something`." - "The expression `array.shape` gives the shape of an array." `````` Dustin Lang committed Jan 27, 2017 22 ``````- "Use `array[x, y]` to select a single element from a 2D array." `````` Greg Wilson committed Jun 25, 2016 23 ``````- "Array indices start at 0, not 1." `````` Dustin Lang committed Jan 27, 2017 24 ``````- "Use `low:high` to specify a `slice` that includes the indices from `low` to `high-1`." `````` Greg Wilson committed Jun 25, 2016 25 26 27 28 29 ``````- "All the indexing and slicing that works on arrays also works on strings." - "Use `# some kind of explanation` to add comments to programs." - "Use `numpy.mean(array)`, `numpy.max(array)`, and `numpy.min(array)` to calculate simple statistics." - "Use `numpy.mean(array, axis=0)` or `numpy.mean(array, axis=1)` to calculate statistics across the specified axis." - "Use the `pyplot` library from `matplotlib` for creating simple visualizations." `````` Greg Wilson committed Mar 03, 2014 30 ``````--- `````` 31 ``````In this lesson we will learn how to manipulate the inflammation dataset with Python. But before we discuss how to deal with many data points, we will show how to store a single value on the computer. `````` Greg Wilson committed Mar 03, 2014 32 33 `````` `````` Trevor Bekolay committed Dec 19, 2017 34 ``````The line below [assigns]({{ page.root }}/reference/#assign) the value `55` to a [variable]({{ page.root }}/reference/#variable) `weight_kg`: `````` Greg Wilson committed Mar 03, 2014 35 `````` `````` Greg Wilson committed Jun 22, 2016 36 ``````~~~ `````` 37 ``````weight_kg = 55 `````` Greg Wilson committed Dec 03, 2014 38 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 39 40 ``````{: .python} `````` Raniere Silva committed Sep 02, 2014 41 ``````A variable is just a name for a value, `````` Saymore Chifamba committed Jul 11, 2017 42 ``````such as `x_val`, `current_temperature`, or `subject_id`. `````` Trevor Bekolay committed Aug 26, 2017 43 ``````Python's variables must begin with a letter and are [case sensitive]({{ page.root }}/reference/#case-sensitive). `````` Kyler Brown committed Apr 22, 2015 44 ``````We can create a new variable by assigning a value to it using `=`. `````` valiseverywhere committed Jan 07, 2017 45 46 ``````When we are finished typing and press Shift+Enter, the notebook runs our command. `````` Greg Wilson committed Mar 03, 2014 47 `````` `````` Azalee Bostroem committed May 09, 2015 48 ``````Once a variable has a value, we can print it to the screen: `````` Greg Wilson committed Mar 03, 2014 49 `````` `````` Greg Wilson committed Jun 22, 2016 50 ``````~~~ `````` Raniere Silva committed Aug 20, 2015 51 ``````print(weight_kg) `````` Greg Wilson committed Dec 03, 2014 52 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 53 54 55 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 56 57 ``````55 ~~~ `````` Greg Wilson committed Jun 22, 2016 58 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 59 `````` `````` Raniere Silva committed Sep 02, 2014 60 ``````and do arithmetic with it: `````` Greg Wilson committed Mar 03, 2014 61 `````` `````` Greg Wilson committed Jun 22, 2016 62 ``````~~~ `````` Raniere Silva committed Aug 20, 2015 63 ``````print('weight in pounds:', 2.2 * weight_kg) `````` Greg Wilson committed Dec 03, 2014 64 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 65 66 67 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 68 69 ``````weight in pounds: 121.0 ~~~ `````` Greg Wilson committed Jun 22, 2016 70 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 71 `````` `````` jstapleton committed Mar 05, 2016 72 73 74 ``````As the example above shows, we can print several things at once by separating them with commas. `````` Raniere Silva committed Sep 02, 2014 75 ``````We can also change a variable's value by assigning it a new one: `````` Greg Wilson committed Mar 03, 2014 76 `````` `````` Greg Wilson committed Jun 22, 2016 77 ``````~~~ `````` Greg Wilson committed Dec 03, 2014 78 ``````weight_kg = 57.5 `````` Raniere Silva committed Aug 20, 2015 79 ``````print('weight in kilograms is now:', weight_kg) `````` Greg Wilson committed Dec 03, 2014 80 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 81 82 83 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 84 85 ``````weight in kilograms is now: 57.5 ~~~ `````` Greg Wilson committed Jun 22, 2016 86 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 87 `````` `````` Raniere Silva committed Sep 02, 2014 88 89 ``````If we imagine the variable as a sticky note with a name written on it, assignment is like putting the sticky note on a particular value: `````` Greg Wilson committed Mar 03, 2014 90 `````` `````` Greg Wilson committed Jul 20, 2016 91 ``````![Variables as Sticky Notes](../fig/python-sticky-note-variables-01.svg) `````` Greg Wilson committed Mar 03, 2014 92 `````` `````` Raniere Silva committed Sep 02, 2014 93 94 95 ``````This means that assigning a value to one variable does *not* change the values of other variables. For example, let's store the subject's weight in pounds in a variable: `````` Greg Wilson committed Mar 03, 2014 96 `````` `````` Greg Wilson committed Jun 22, 2016 97 ``````~~~ `````` Greg Wilson committed Dec 03, 2014 98 ``````weight_lb = 2.2 * weight_kg `````` Raniere Silva committed Aug 20, 2015 99 ``````print('weight in kilograms:', weight_kg, 'and in pounds:', weight_lb) `````` Greg Wilson committed Dec 03, 2014 100 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 101 102 103 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 104 105 ``````weight in kilograms: 57.5 and in pounds: 126.5 ~~~ `````` Greg Wilson committed Jun 22, 2016 106 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 107 `````` `````` Greg Wilson committed Jul 20, 2016 108 ``````![Creating Another Variable](../fig/python-sticky-note-variables-02.svg) `````` Greg Wilson committed Mar 03, 2014 109 `````` `````` Raniere Silva committed Sep 02, 2014 110 ``````and then change `weight_kg`: `````` Greg Wilson committed Mar 03, 2014 111 `````` `````` Greg Wilson committed Jun 22, 2016 112 ``````~~~ `````` Greg Wilson committed Dec 03, 2014 113 ``````weight_kg = 100.0 `````` Raniere Silva committed Aug 20, 2015 114 ``````print('weight in kilograms is now:', weight_kg, 'and weight in pounds is still:', weight_lb) `````` Greg Wilson committed Dec 03, 2014 115 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 116 117 118 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 119 120 ``````weight in kilograms is now: 100.0 and weight in pounds is still: 126.5 ~~~ `````` Greg Wilson committed Jun 22, 2016 121 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 122 `````` `````` Greg Wilson committed Jul 20, 2016 123 ``````![Updating a Variable](../fig/python-sticky-note-variables-03.svg) `````` Greg Wilson committed Mar 03, 2014 124 `````` `````` Raniere Silva committed Sep 02, 2014 125 126 127 128 ``````Since `weight_lb` doesn't "remember" where its value came from, it isn't automatically updated when `weight_kg` changes. This is different from the way spreadsheets work. `````` Greg Wilson committed Jun 22, 2016 129 ``````> ## Who's Who in Memory `````` Benjamin Laken committed Nov 09, 2015 130 ``````> `````` Trevor Bekolay committed Jun 22, 2016 131 132 133 ``````> You can use the `%whos` command at any time to see what > variables you have created and what modules you have loaded into the computer's memory. > As this is an IPython command, it will only work if you are in an IPython terminal or the Jupyter Notebook. `````` Benjamin Laken committed Nov 09, 2015 134 ``````> `````` Greg Wilson committed Jun 22, 2016 135 ``````> ~~~ `````` Trevor Bekolay committed Jun 22, 2016 136 137 ``````> %whos > ~~~ `````` Greg Wilson committed Jun 22, 2016 138 139 140 ``````> {: .python} > > ~~~ `````` Trevor Bekolay committed Jun 22, 2016 141 142 143 144 145 ``````> Variable Type Data/Info > -------------------------------- > weight_kg float 100.0 > weight_lb float 126.5 > ~~~ `````` Greg Wilson committed Jun 22, 2016 146 147 ``````> {: .output} {: .callout} `````` Benjamin Laken committed Nov 09, 2015 148 `````` `````` devendra1810 committed Jul 19, 2016 149 150 151 152 ``````Words are useful, but what's more useful are the sentences and stories we build with them. Similarly, while a lot of powerful, general tools are built into languages like Python, `````` Trevor Bekolay committed Aug 26, 2017 153 ``````specialized tools built up from these basic units live in [libraries]({{ page.root }}/reference/#library) `````` devendra1810 committed Jul 19, 2016 154 155 156 ``````that can be called upon when needed. In order to load our inflammation data, `````` Trevor Bekolay committed Aug 26, 2017 157 ``````we need to access ([import]({{ page.root }}/reference/#import) in Python terminology) `````` devendra1810 committed Jul 19, 2016 158 159 160 161 162 163 164 165 166 167 168 169 ``````a library called [NumPy](http://docs.scipy.org/doc/numpy/ "NumPy Documentation"). In general you should use this library if you want to do fancy things with numbers, especially if you have matrices or arrays. We can import NumPy using: ~~~ import numpy ~~~ {: .python} Importing a library is like getting a piece of lab equipment out of a storage locker and setting it up on the bench. Libraries provide additional functionality to the basic Python package, `````` Valentina Staneva committed May 15, 2017 170 ``````much like a new piece of equipment adds functionality to a lab space. Just like in the lab, importing too many libraries `````` Trevor Bekolay committed Aug 26, 2017 171 ``````can sometimes complicate and slow down your programs - so we only import what we need for each program. `````` Valentina Staneva committed Jul 31, 2017 172 ``````Once we've imported the library, `````` devendra1810 committed Jul 19, 2016 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 ``````we can ask the library to read our data file for us: ~~~ numpy.loadtxt(fname='inflammation-01.csv', delimiter=',') ~~~ {: .python} ~~~ array([[ 0., 0., 1., ..., 3., 0., 0.], [ 0., 1., 2., ..., 1., 0., 1.], [ 0., 1., 1., ..., 2., 1., 1.], ..., [ 0., 1., 1., ..., 1., 1., 1.], [ 0., 0., 0., ..., 0., 2., 0.], [ 0., 0., 1., ..., 1., 1., 0.]]) ~~~ {: .output} `````` Trevor Bekolay committed Aug 26, 2017 191 192 193 ``````The expression `numpy.loadtxt(...)` is a [function call]({{ page.root }}/reference/#function-call) that asks Python to run the [function]({{ page.root }}/reference/#function) `loadtxt` which belongs to the `numpy` library. This [dotted notation]({{ page.root }}/reference/#dotted-notation) is used everywhere in Python `````` devendra1810 committed Jul 19, 2016 194 195 ``````to refer to the parts of things as `thing.component`. `````` Trevor Bekolay committed Aug 26, 2017 196 ```````numpy.loadtxt` has two [parameters]({{ page.root }}/reference/#parameter): `````` devendra1810 committed Jul 19, 2016 197 ``````the name of the file we want to read, `````` Trevor Bekolay committed Aug 26, 2017 198 199 ``````and the [delimiter]({{ page.root }}/reference/#delimiter) that separates values on a line. These both need to be character strings (or [strings]({{ page.root }}/reference/#string) for short), `````` devendra1810 committed Jul 19, 2016 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 ``````so we put them in quotes. Since we haven't told it to do anything else with the function's output, the notebook displays it. In this case, that output is the data we just loaded. By default, only a few rows and columns are shown (with `...` to omit elements when displaying big arrays). To save space, Python displays numbers as `1.` instead of `1.0` when there's nothing interesting after the decimal point. Our call to `numpy.loadtxt` read our file, but didn't save the data in memory. To do that, `````` 216 ``````we need to assign the array to a variable. Just as we can assign a single value to a variable, we can also assign an array of values `````` Johnny Lin committed Sep 22, 2014 217 ``````to a variable using the same syntax. Let's re-run `numpy.loadtxt` and save its result: `````` Greg Wilson committed Mar 03, 2014 218 `````` `````` Greg Wilson committed Jun 22, 2016 219 ``````~~~ `````` Greg Wilson committed Dec 03, 2014 220 221 ``````data = numpy.loadtxt(fname='inflammation-01.csv', delimiter=',') ~~~ `````` Greg Wilson committed Jun 22, 2016 222 ``````{: .python} `````` Greg Wilson committed Mar 03, 2014 223 `````` `````` Raniere Silva committed Sep 02, 2014 224 225 226 ``````This statement doesn't produce any output because assignment doesn't display anything. If we want to check that our data has been loaded, we can print the variable's value: `````` Greg Wilson committed Mar 03, 2014 227 `````` `````` Greg Wilson committed Jun 22, 2016 228 ``````~~~ `````` Raniere Silva committed Aug 20, 2015 229 ``````print(data) `````` Greg Wilson committed Dec 03, 2014 230 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 231 232 233 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 234 ``````[[ 0. 0. 1. ..., 3. 0. 0.] `````` Greg Wilson committed Mar 03, 2014 235 236 `````` [ 0. 1. 2. ..., 1. 0. 1.] [ 0. 1. 1. ..., 2. 1. 1.] `````` 237 `````` ..., `````` Greg Wilson committed Mar 03, 2014 238 239 240 `````` [ 0. 1. 1. ..., 1. 1. 1.] [ 0. 0. 0. ..., 0. 2. 0.] [ 0. 0. 1. ..., 1. 1. 0.]] `````` Greg Wilson committed Dec 03, 2014 241 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 242 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 243 `````` `````` Raniere Silva committed Sep 02, 2014 244 245 246 ``````Now that our data is in memory, we can start doing things with it. First, `````` Greg Wilson committed Sep 05, 2016 247 ``````let's ask what [type]({{ page.root }}/reference/#type) of thing `data` refers to: `````` Greg Wilson committed Mar 03, 2014 248 `````` `````` Greg Wilson committed Jun 22, 2016 249 ``````~~~ `````` Raniere Silva committed Aug 20, 2015 250 ``````print(type(data)) `````` Greg Wilson committed Dec 03, 2014 251 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 252 253 254 ``````{: .python} ~~~ `````` Trevor Bekolay committed Aug 28, 2015 255 `````` `````` Greg Wilson committed Dec 03, 2014 256 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 257 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 258 `````` `````` 259 260 261 262 263 264 ``````The output tells us that `data` currently refers to an N-dimensional array created by the NumPy library. These data correspond to arthritis patients' inflammation. The rows are the individual patients and the columns are their daily inflammation measurements. `````` Greg Wilson committed Jun 22, 2016 265 ``````> ## Data Type `````` 266 267 268 269 ``````> > A Numpy array contains one or more elements > of the same type. `type` will only tell you that > a variable is a NumPy array. `````` Valentina Staneva committed Jul 18, 2016 270 ``````> We can also find out the type `````` 271 272 ``````> of the data contained in the NumPy array. > `````` Greg Wilson committed Jun 22, 2016 273 ``````> ~~~ `````` 274 275 ``````> print(data.dtype) > ~~~ `````` Greg Wilson committed Jun 22, 2016 276 277 278 ``````> {: .python} > > ~~~ `````` 279 280 ``````> dtype('float64') > ~~~ `````` Greg Wilson committed Jun 22, 2016 281 ``````> {: .output} `````` 282 283 ``````> > This tells us that the NumPy array's elements are `````` Greg Wilson committed Sep 05, 2016 284 ``````> [floating-point numbers]({{ page.root }}/reference/#floating-point number). `````` Greg Wilson committed Jun 22, 2016 285 ``````{: .callout} `````` 286 `````` `````` Bree Norlander committed Jul 19, 2017 287 ``````With this command we can see the array's [shape]({{ page.root }}/reference/#shape): `````` Greg Wilson committed Mar 03, 2014 288 `````` `````` Greg Wilson committed Jun 22, 2016 289 ``````~~~ `````` Raniere Silva committed Aug 20, 2015 290 ``````print(data.shape) `````` Greg Wilson committed Dec 03, 2014 291 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 292 293 294 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 295 296 ``````(60, 40) ~~~ `````` Greg Wilson committed Jun 22, 2016 297 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 298 `````` `````` Azalee Bostroem committed May 09, 2015 299 300 ``````This tells us that `data` has 60 rows and 40 columns. When we created the variable `data` to store our arthritis data, we didn't just create the array, we also `````` Greg Wilson committed Sep 05, 2016 301 ``````created information about the array, called [members]({{ page.root }}/reference/#member) or `````` Azalee Bostroem committed May 09, 2015 302 303 ``````attributes. This extra information describes `data` in the same way an adjective describes a noun. `````` Bartosz T committed Jun 13, 2016 304 ```````data.shape` is an attribute of `data` which describes the dimensions of `data`. `````` Azalee Bostroem committed May 09, 2015 305 ``````We use the same dotted notation for the attributes of variables `````` Raniere Silva committed Sep 02, 2014 306 307 ``````that we use for the functions in libraries because they have the same part-and-whole relationship. `````` Greg Wilson committed Mar 03, 2014 308 `````` `````` Azalee Bostroem committed May 09, 2015 309 ``````If we want to get a single number from the array, `````` Greg Wilson committed Sep 05, 2016 310 ``````we must provide an [index]({{ page.root }}/reference/#index) in square brackets, `````` Dustin Lang committed Jan 27, 2017 311 ``````just as we do in math when referring to an element of a matrix. Our inflammation data has two dimensions, so we will need to use two indices to refer to a value: `````` Greg Wilson committed Mar 03, 2014 312 `````` `````` Greg Wilson committed Jun 22, 2016 313 ``````~~~ `````` Raniere Silva committed Aug 20, 2015 314 ``````print('first value in data:', data[0, 0]) `````` Greg Wilson committed Dec 03, 2014 315 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 316 317 318 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 319 320 ``````first value in data: 0.0 ~~~ `````` Greg Wilson committed Jun 22, 2016 321 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 322 `````` `````` Greg Wilson committed Jun 22, 2016 323 ``````~~~ `````` Raniere Silva committed Aug 20, 2015 324 ``````print('middle value in data:', data[30, 20]) `````` Greg Wilson committed Dec 03, 2014 325 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 326 327 328 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 329 330 ``````middle value in data: 13.0 ~~~ `````` Greg Wilson committed Jun 22, 2016 331 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 332 `````` `````` Raniere Silva committed Sep 02, 2014 333 334 ``````The expression `data[30, 20]` may not surprise you, but `data[0, 0]` might. `````` Tim Millar committed Apr 26, 2017 335 ``````Programming languages like Fortran, MATLAB and R start counting at 1, `````` Raniere Silva committed Sep 02, 2014 336 337 ``````because that's what human beings have done for thousands of years. Languages in the C family (including C++, Java, Perl, and Python) count from 0 `````` Thomas Robitaille committed Oct 04, 2016 338 339 340 341 342 ``````because it represents an offset from the first value in the array (the second value is offset by one index from the first value). This is closer to the way that computers represent arrays (if you are interested in the historical reasons behind counting indices from zero, you can read [Mike Hoye's blog post](http://exple.tive.org/blarg/2013/10/22/citation-needed/)). `````` Raniere Silva committed Sep 02, 2014 343 ``````As a result, `````` Greg Wilson committed Jul 10, 2016 344 ``````if we have an M×N array in Python, `````` Raniere Silva committed Sep 02, 2014 345 346 347 348 349 350 ``````its indices go from 0 to M-1 on the first axis and 0 to N-1 on the second. It takes a bit of getting used to, but one way to remember the rule is that the index is how many steps we have to take from the start to get the item we want. `````` Eleanor Lutz committed Jun 20, 2017 351 352 ``````![Zero Index](../fig/python-zero-index.png) `````` Greg Wilson committed Jun 22, 2016 353 ``````> ## In the Corner `````` Raniere Silva committed Sep 02, 2014 354 355 356 357 358 359 ``````> > What may also surprise you is that when Python displays an array, > it shows the element with index `[0, 0]` in the upper left corner > rather than the lower left. > This is consistent with the way mathematicians draw matrices, > but different from the Cartesian coordinates. `````` 360 ``````> The indices are (row, column) instead of (column, row) for the same reason, `````` Greg Wilson committed Sep 08, 2014 361 ``````> which can be confusing when plotting data. `````` Greg Wilson committed Jun 22, 2016 362 ``````{: .callout} `````` Raniere Silva committed Sep 02, 2014 363 364 365 366 367 `````` An index like `[30, 20]` selects a single element of an array, but we can select whole sections as well. For example, we can select the first ten days (columns) of values `````` shiffer1 committed Jun 25, 2015 368 ``````for the first four patients (rows) like this: `````` Greg Wilson committed Mar 03, 2014 369 `````` `````` Greg Wilson committed Jun 22, 2016 370 ``````~~~ `````` Raniere Silva committed Aug 20, 2015 371 ``````print(data[0:4, 0:10]) `````` Greg Wilson committed Dec 03, 2014 372 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 373 374 375 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 376 ``````[[ 0. 0. 1. 3. 1. 2. 4. 7. 8. 3.] `````` Greg Wilson committed Mar 03, 2014 377 378 379 `````` [ 0. 1. 2. 1. 2. 1. 3. 2. 2. 6.] [ 0. 1. 1. 3. 3. 2. 6. 2. 5. 9.] [ 0. 0. 2. 0. 4. 2. 2. 1. 6. 7.]] `````` Greg Wilson committed Dec 03, 2014 380 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 381 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 382 `````` `````` Greg Wilson committed Sep 05, 2016 383 ``````The [slice]({{ page.root }}/reference/#slice) `0:4` means, `````` Raniere Silva committed Sep 02, 2014 384 385 386 387 388 389 ``````"Start at index 0 and go up to, but not including, index 4." Again, the up-to-but-not-including takes a bit of getting used to, but the rule is that the difference between the upper and lower bounds is the number of values in the slice. We don't have to start slices at 0: `````` Greg Wilson committed Mar 03, 2014 390 `````` `````` Greg Wilson committed Jun 22, 2016 391 ``````~~~ `````` Raniere Silva committed Aug 20, 2015 392 ``````print(data[5:10, 0:10]) `````` Greg Wilson committed Dec 03, 2014 393 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 394 395 396 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 397 ``````[[ 0. 0. 1. 2. 2. 4. 2. 1. 6. 4.] `````` Greg Wilson committed Mar 03, 2014 398 399 400 401 `````` [ 0. 0. 2. 2. 4. 2. 2. 5. 5. 8.] [ 0. 0. 1. 2. 3. 1. 2. 3. 5. 3.] [ 0. 0. 0. 3. 1. 5. 6. 5. 5. 8.] [ 0. 1. 1. 2. 1. 3. 5. 3. 5. 8.]] `````` Greg Wilson committed Dec 03, 2014 402 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 403 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 404 `````` `````` Raniere Silva committed Sep 02, 2014 405 406 407 408 409 410 411 412 ``````We also don't have to include the upper and lower bound on the slice. If we don't include the lower bound, Python uses 0 by default; if we don't include the upper, the slice runs to the end of the axis, and if we don't include either (i.e., if we just use ':' on its own), the slice includes everything: `````` Greg Wilson committed Mar 03, 2014 413 `````` `````` Greg Wilson committed Jun 22, 2016 414 ``````~~~ `````` Greg Wilson committed Dec 03, 2014 415 ``````small = data[:3, 36:] `````` Raniere Silva committed Aug 20, 2015 416 417 ``````print('small is:') print(small) `````` Greg Wilson committed Dec 03, 2014 418 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 419 420 421 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 422 ``````small is: `````` Greg Wilson committed Mar 03, 2014 423 424 425 ``````[[ 2. 3. 0. 0.] [ 1. 1. 0. 1.] [ 2. 2. 1. 1.]] `````` Greg Wilson committed Dec 03, 2014 426 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 427 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 428 `````` `````` Raniere Silva committed Sep 02, 2014 429 ``````Arrays also know how to perform common mathematical operations on their values. `````` Greg Wilson committed Dec 03, 2014 430 431 432 433 434 ``````The simplest operations with data are arithmetic: add, subtract, multiply, and divide. When you do such operations on arrays, the operation is done on each individual element of the array. Thus: `````` Johnny Lin committed Sep 22, 2014 435 `````` `````` Greg Wilson committed Jun 22, 2016 436 ``````~~~ `````` Greg Wilson committed Dec 03, 2014 437 438 ``````doubledata = data * 2.0 ~~~ `````` Greg Wilson committed Jun 22, 2016 439 ``````{: .python} `````` Trevor Bekolay committed Sep 29, 2014 440 `````` `````` Greg Wilson committed Dec 03, 2014 441 442 ``````will create a new array `doubledata` whose elements have the value of two times the value of the corresponding elements in `data`: `````` Johnny Lin committed Sep 22, 2014 443 `````` `````` Greg Wilson committed Jun 22, 2016 444 ``````~~~ `````` Raniere Silva committed Aug 20, 2015 445 446 447 448 ``````print('original:') print(data[:3, 36:]) print('doubledata:') print(doubledata[:3, 36:]) `````` Greg Wilson committed Dec 03, 2014 449 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 450 451 452 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 453 ``````original: `````` Trevor Bekolay committed Sep 29, 2014 454 455 456 457 458 459 460 ``````[[ 2. 3. 0. 0.] [ 1. 1. 0. 1.] [ 2. 2. 1. 1.]] doubledata: [[ 4. 6. 0. 0.] [ 2. 2. 0. 2.] [ 4. 4. 2. 2.]] `````` Greg Wilson committed Dec 03, 2014 461 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 462 ``````{: .output} `````` Trevor Bekolay committed Sep 29, 2014 463 `````` `````` Greg Wilson committed Dec 03, 2014 464 465 ``````If, instead of taking an array and doing arithmetic with a single value (as above) `````` Azalee Bostroem committed May 09, 2015 466 ``````you did the arithmetic operation with another array of the same shape, `````` Greg Wilson committed Dec 03, 2014 467 468 ``````the operation will be done on corresponding elements of the two arrays. Thus: `````` Trevor Bekolay committed Sep 29, 2014 469 `````` `````` Greg Wilson committed Jun 22, 2016 470 ``````~~~ `````` Greg Wilson committed Dec 03, 2014 471 472 ``````tripledata = doubledata + data ~~~ `````` Greg Wilson committed Jun 22, 2016 473 ``````{: .python} `````` Trevor Bekolay committed Sep 29, 2014 474 `````` `````` Johnny Lin committed Sep 22, 2014 475 476 477 ``````will give you an array where `tripledata[0,0]` will equal `doubledata[0,0]` plus `data[0,0]`, and so on for all other elements of the arrays. `````` Greg Wilson committed Jun 22, 2016 478 ``````~~~ `````` Raniere Silva committed Aug 20, 2015 479 480 ``````print('tripledata:') print(tripledata[:3, 36:]) `````` Greg Wilson committed Dec 03, 2014 481 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 482 483 484 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 485 ``````tripledata: `````` Trevor Bekolay committed Sep 29, 2014 486 487 488 ``````[[ 6. 9. 0. 0.] [ 3. 3. 0. 3.] [ 6. 6. 3. 3.]] `````` Greg Wilson committed Dec 03, 2014 489 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 490 ``````{: .output} `````` Trevor Bekolay committed Sep 29, 2014 491 `````` `````` Johnny Lin committed Sep 22, 2014 492 ``````Often, we want to do more than add, subtract, multiply, and divide values of data. `````` Trevor Bekolay committed Jun 22, 2016 493 ``````NumPy knows how to do more complex operations on arrays. `````` Raniere Silva committed Sep 02, 2014 494 495 ``````If we want to find the average inflammation for all patients on all days, for example, `````` Trevor Bekolay committed Jun 22, 2016 496 ``````we can ask NumPy to compute `data`'s mean value: `````` Greg Wilson committed Mar 03, 2014 497 `````` `````` Greg Wilson committed Jun 22, 2016 498 ``````~~~ `````` Trevor Bekolay committed Jun 22, 2016 499 ``````print(numpy.mean(data)) `````` Greg Wilson committed Dec 03, 2014 500 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 501 502 503 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 504 505 ``````6.14875 ~~~ `````` Greg Wilson committed Jun 22, 2016 506 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 507 `````` `````` Greg Wilson committed Sep 05, 2016 508 509 ```````mean` is a [function]({{ page.root }}/reference/#function) that takes an array as an [argument]({{ page.root }}/reference/#argument). `````` Trevor Bekolay committed Jun 22, 2016 510 511 512 ``````If variables are nouns, functions are verbs: they do things with variables. `````` Greg Wilson committed Jun 22, 2016 513 ``````> ## Not All Functions Have Input `````` Trevor Bekolay committed Jun 22, 2016 514 515 516 ``````> > Generally, a function uses inputs to produce outputs. > However, some functions produce outputs without `````` Trevor Bekolay committed Jun 22, 2016 517 518 ``````> needing any input. For example, checking the current time > doesn't require any input. `````` Trevor Bekolay committed Jun 22, 2016 519 ``````> `````` Greg Wilson committed Jun 22, 2016 520 ``````> ~~~ `````` Trevor Bekolay committed Jun 22, 2016 521 522 ``````> import time > print(time.ctime()) `````` Trevor Bekolay committed Jun 22, 2016 523 ``````> ~~~ `````` Greg Wilson committed Jun 22, 2016 524 525 526 ``````> {: .python} > > ~~~ `````` Trevor Bekolay committed Jun 22, 2016 527 ``````> 'Sat Mar 26 13:07:33 2016' `````` Trevor Bekolay committed Jun 22, 2016 528 ``````> ~~~ `````` Greg Wilson committed Jun 22, 2016 529 ``````> {: .output} `````` Trevor Bekolay committed Jun 22, 2016 530 531 532 533 ``````> > For functions that don't take in any arguments, > we still need parentheses (`()`) > to tell Python to go and do something for us. `````` Greg Wilson committed Jun 22, 2016 534 ``````{: .callout} `````` Trevor Bekolay committed Jun 22, 2016 535 536 537 `````` NumPy has lots of useful functions that take an array as input. Let's use three of those functions to get some descriptive values about the dataset. `````` Trevor Bekolay committed Jun 21, 2016 538 539 ``````We'll also use multiple assignment, a convenient Python feature that will enable us to do this all in one line. `````` Greg Wilson committed Mar 03, 2014 540 `````` `````` Greg Wilson committed Jun 22, 2016 541 ``````~~~ `````` Trevor Bekolay committed Jun 22, 2016 542 ``````maxval, minval, stdval = numpy.max(data), numpy.min(data), numpy.std(data) `````` Trevor Bekolay committed Jun 21, 2016 543 `````` `````` Alistair Walsh committed Jun 21, 2016 544 545 546 ``````print('maximum inflammation:', maxval) print('minimum inflammation:', minval) print('standard deviation:', stdval) `````` Greg Wilson committed Dec 03, 2014 547 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 548 549 550 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 551 ``````maximum inflammation: 20.0 `````` Greg Wilson committed Mar 03, 2014 552 553 ``````minimum inflammation: 0.0 standard deviation: 4.61383319712 `````` Greg Wilson committed Dec 03, 2014 554 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 555 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 556 `````` `````` Greg Wilson committed Jun 22, 2016 557 ``````> ## Mystery Functions in IPython `````` Benjamin Laken committed Dec 04, 2015 558 ``````> `````` Trevor Bekolay committed Jun 22, 2016 559 560 ``````> How did we know what functions NumPy has and how to use them? > If you are working in the IPython/Jupyter Notebook there is an easy way to find out. `````` Dustin Lang committed Jan 27, 2017 561 ``````> If you type the name of something followed by a dot, then you can use tab completion `````` Trevor Bekolay committed Jun 22, 2016 562 563 564 565 ``````> (e.g. type `numpy.` and then press tab) > to see a list of all functions and attributes that you can use. After selecting one you > can also add a question mark (e.g. `numpy.cumprod?`) and IPython will return an > explanation of the method! This is the same as doing `help(numpy.cumprod)`. `````` Greg Wilson committed Jun 22, 2016 566 ``````{: .callout} `````` Trevor Bekolay committed Jun 22, 2016 567 568 `````` When analyzing data, though, `````` Raniere Silva committed Sep 02, 2014 569 570 571 ``````we often want to look at partial statistics, such as the maximum value per patient or the average value per day. `````` Azalee Bostroem committed May 09, 2015 572 ``````One way to do this is to create a new temporary array of the data we want, `````` Raniere Silva committed Sep 02, 2014 573 ``````then ask it to do the calculation: `````` Greg Wilson committed Mar 03, 2014 574 `````` `````` Greg Wilson committed Jun 22, 2016 575 ``````~~~ `````` Dustin Lang committed Jan 27, 2017 576 ``````patient_0 = data[0, :] # 0 on the first axis (rows), everything on the second (columns) `````` Raniere Silva committed Aug 20, 2015 577 ``````print('maximum inflammation for patient 0:', patient_0.max()) `````` Greg Wilson committed Dec 03, 2014 578 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 579 580 581 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 582 583 ``````maximum inflammation for patient 0: 18.0 ~~~ `````` Greg Wilson committed Jun 22, 2016 584 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 585 `````` `````` valiseverywhere committed Jun 20, 2016 586 ``````Everything in a line of code following the '#' symbol is a `````` Dustin Lang committed Jan 27, 2017 587 ``````[comment]({{ page.root }}/reference/#comment) that is ignored by Python. `````` valiseverywhere committed Jun 20, 2016 588 ``````Comments allow programmers to leave explanatory notes for other `````` jstapleton committed Mar 05, 2016 589 590 ``````programmers or their future selves. `````` Raniere Silva committed Sep 02, 2014 591 ``````We don't actually need to store the row in a variable of its own. `````` Trevor Bekolay committed Jun 22, 2016 592 ``````Instead, we can combine the selection and the function call: `````` Greg Wilson committed Mar 03, 2014 593 `````` `````` Greg Wilson committed Jun 22, 2016 594 ``````~~~ `````` Trevor Bekolay committed Jun 22, 2016 595 ``````print('maximum inflammation for patient 2:', numpy.max(data[2, :])) `````` Greg Wilson committed Dec 03, 2014 596 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 597 598 599 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 600 601 ``````maximum inflammation for patient 2: 19.0 ~~~ `````` Greg Wilson committed Jun 22, 2016 602 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 603 `````` `````` Valentina Staneva committed Jul 18, 2016 604 ``````What if we need the maximum inflammation for each patient over all days (as in the `````` 605 606 607 ``````next diagram on the left), or the average for each day (as in the diagram on the right)? As the diagram below shows, we want to perform the operation across an axis: `````` Greg Wilson committed Mar 03, 2014 608 `````` `````` Greg Wilson committed Jul 20, 2016 609 ``````![Operations Across Axes](../fig/python-operations-across-axes.png) `````` Greg Wilson committed Mar 03, 2014 610 `````` `````` Raniere Silva committed Sep 02, 2014 611 ``````To support this, `````` Trevor Bekolay committed Jun 22, 2016 612 ``````most array functions allow us to specify the axis we want to work on. `````` 613 ``````If we ask for the average across axis 0 (rows in our 2D example), `````` Raniere Silva committed Sep 02, 2014 614 ``````we get: `````` Greg Wilson committed Mar 03, 2014 615 `````` `````` Greg Wilson committed Jun 22, 2016 616 ``````~~~ `````` Trevor Bekolay committed Jun 22, 2016 617 ``````print(numpy.mean(data, axis=0)) `````` Greg Wilson committed Dec 03, 2014 618 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 619 620 621 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 622 ``````[ 0. 0.45 1.11666667 1.75 2.43333333 3.15 `````` Greg Wilson committed Mar 03, 2014 623 624 625 626 627 628 629 `````` 3.8 3.88333333 5.23333333 5.51666667 5.95 5.9 8.35 7.73333333 8.36666667 9.5 9.58333333 10.63333333 11.56666667 12.35 13.25 11.96666667 11.03333333 10.16666667 10. 8.66666667 9.15 7.25 7.33333333 6.58333333 6.06666667 5.95 5.11666667 3.6 3.3 3.56666667 2.48333333 1.5 1.13333333 0.56666667] `````` Greg Wilson committed Dec 03, 2014 630 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 631 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 632 `````` `````` Raniere Silva committed Sep 02, 2014 633 634 ``````As a quick check, we can ask this array what its shape is: `````` Greg Wilson committed Mar 03, 2014 635 `````` `````` Greg Wilson committed Jun 22, 2016 636 ``````~~~ `````` Trevor Bekolay committed Jun 22, 2016 637 ``````print(numpy.mean(data, axis=0).shape) `````` Greg Wilson committed Dec 03, 2014 638 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 639 640 641 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 642 643 ``````(40,) ~~~ `````` Greg Wilson committed Jun 22, 2016 644 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 645 `````` `````` Greg Wilson committed Jul 10, 2016 646 ``````The expression `(40,)` tells us we have an N×1 vector, `````` Raniere Silva committed Sep 02, 2014 647 ``````so this is the average inflammation per day for all patients. `````` 648 ``````If we average across axis 1 (columns in our 2D example), we get: `````` Greg Wilson committed Mar 03, 2014 649 `````` `````` Greg Wilson committed Jun 22, 2016 650 ``````~~~ `````` Trevor Bekolay committed Jun 22, 2016 651 ``````print(numpy.mean(data, axis=1)) `````` Greg Wilson committed Dec 03, 2014 652 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 653 654 655 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 656 ``````[ 5.45 5.425 6.1 5.9 5.55 6.225 5.975 6.65 6.625 6.525 `````` Greg Wilson committed Mar 03, 2014 657 658 659 660 661 `````` 6.775 5.8 6.225 5.75 5.225 6.3 6.55 5.7 5.85 6.55 5.775 5.825 6.175 6.1 5.8 6.425 6.05 6.025 6.175 6.55 6.175 6.35 6.725 6.125 7.075 5.725 5.925 6.15 6.075 5.75 5.975 5.725 6.3 5.9 6.75 5.925 7.225 6.15 5.95 6.275 5.7 6.1 6.825 5.975 6.725 5.7 6.25 6.4 7.05 5.9 ] `````` Greg Wilson committed Dec 03, 2014 662 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 663 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 664 `````` `````` Raniere Silva committed Sep 02, 2014 665 666 667 668 669 ``````which is the average inflammation per patient across all days. The mathematician Richard Hamming once said, "The purpose of computing is insight, not numbers," and the best way to develop insight is often to visualize data. `````` Valentina Staneva committed Jul 18, 2016 670 ``````Visualization deserves an entire lecture (of course) of its own, `````` Azalee Bostroem committed May 09, 2015 671 ``````but we can explore a few features of Python's `matplotlib` library here. `````` Greg Wilson committed Dec 03, 2014 672 673 ``````While there is no "official" plotting library, this package is the de facto standard. `````` Raniere Silva committed Sep 02, 2014 674 675 676 ``````First, we will import the `pyplot` module from `matplotlib` and use two of its functions to create and display a heat map of our data: `````` Greg Wilson committed Mar 03, 2014 677 `````` `````` Greg Wilson committed Jun 22, 2016 678 ``````~~~ `````` Azalee Bostroem committed May 09, 2015 679 ``````import matplotlib.pyplot `````` Konrad Förstner committed Oct 18, 2016 680 ``````image = matplotlib.pyplot.imshow(data) `````` Elliott Sales de Andrade committed Jan 22, 2016 681 ``````matplotlib.pyplot.show() `````` Greg Wilson committed Dec 03, 2014 682 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 683 ``````{: .python} `````` Greg Wilson committed Mar 03, 2014 684 `````` `````` Greg Wilson committed Jul 20, 2016 685 ``````![Heatmap of the Data](../fig/01-numpy_71_0.png) `````` Greg Wilson committed Mar 03, 2014 686 `````` `````` Raniere Silva committed Sep 02, 2014 687 688 689 ``````Blue regions in this heat map are low values, while red shows high values. As we can see, inflammation rises and falls over a 40-day period. `````` Damien Irving committed May 26, 2015 690 `````` `````` Greg Wilson committed Jun 22, 2016 691 ``````> ## Some IPython Magic `````` Damien Irving committed May 26, 2015 692 693 694 695 ``````> > If you're using an IPython / Jupyter notebook, > you'll need to execute the following command > in order for your matplotlib images to appear `````` Damien Irving committed May 27, 2015 696 ``````> in the notebook when `show()` is called: `````` Damien Irving committed May 26, 2015 697 ``````> `````` Greg Wilson committed Jun 22, 2016 698 ``````> ~~~ `````` Nicola Soranzo committed May 02, 2017 699 ``````> %matplotlib inline `````` Damien Irving committed May 26, 2015 700 ``````> ~~~ `````` Greg Wilson committed Jun 22, 2016 701 ``````> {: .python} `````` Trevor Bekolay committed Jan 18, 2016 702 ``````> `````` shiffer1 committed Jun 25, 2015 703 704 ``````> The `%` indicates an IPython magic function - > a function that is only valid within the notebook environment. `````` Damien Irving committed May 26, 2015 705 ``````> Note that you only have to execute this function once per notebook. `````` Greg Wilson committed Jun 22, 2016 706 ``````{: .callout} `````` Damien Irving committed May 26, 2015 707 `````` `````` Raniere Silva committed Sep 02, 2014 708 ``````Let's take a look at the average inflammation over time: `````` Greg Wilson committed Mar 03, 2014 709 `````` `````` Greg Wilson committed Jun 22, 2016 710 ``````~~~ `````` Trevor Bekolay committed Jun 22, 2016 711 ``````ave_inflammation = numpy.mean(data, axis=0) `````` Damien Irving committed May 26, 2015 712 ``````ave_plot = matplotlib.pyplot.plot(ave_inflammation) `````` Elliott Sales de Andrade committed Jan 22, 2016 713 ``````matplotlib.pyplot.show() `````` Greg Wilson committed Dec 03, 2014 714 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 715 ``````{: .python} `````` Greg Wilson committed Mar 03, 2014 716 `````` `````` Greg Wilson committed Jul 20, 2016 717 ``````![Average Inflammation Over Time](../fig/01-numpy_73_0.png) `````` Greg Wilson committed Mar 03, 2014 718 `````` `````` Raniere Silva committed Sep 02, 2014 719 720 ``````Here, we have put the average per day across all patients in the variable `ave_inflammation`, `````` Damien Irving committed May 26, 2015 721 ``````then asked `matplotlib.pyplot` to create and display a line graph of those values. `````` Raniere Silva committed Sep 02, 2014 722 723 724 725 726 ``````The result is roughly a linear rise and fall, which is suspicious: based on other studies, we expect a sharper rise and slower fall. Let's have a look at two other statistics: `````` Greg Wilson committed Mar 03, 2014 727 `````` `````` Greg Wilson committed Jun 22, 2016 728 ``````~~~ `````` Trevor Bekolay committed Jun 22, 2016 729 ``````max_plot = matplotlib.pyplot.plot(numpy.max(data, axis=0)) `````` Elliott Sales de Andrade committed Jan 22, 2016 730 ``````matplotlib.pyplot.show() `````` Greg Wilson committed Dec 03, 2014 731 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 732 ``````{: .python} `````` Greg Wilson committed Mar 03, 2014 733 `````` `````` Greg Wilson committed Jul 20, 2016 734 ``````![Maximum Value Along The First Axis](../fig/01-numpy_75_1.png) `````` Greg Wilson committed Dec 03, 2014 735 `````` `````` Greg Wilson committed Jun 22, 2016 736 ``````~~~ `````` Trevor Bekolay committed Jun 22, 2016 737 ``````min_plot = matplotlib.pyplot.plot(numpy.min(data, axis=0)) `````` Elliott Sales de Andrade committed Jan 22, 2016 738 ``````matplotlib.pyplot.show() `````` Greg Wilson committed Dec 03, 2014 739 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 740 ``````{: .python} `````` Greg Wilson committed Apr 09, 2014 741 `````` `````` Greg Wilson committed Jul 20, 2016 742 ``````![Minimum Value Along The First Axis](../fig/01-numpy_75_3.png) `````` Greg Wilson committed Mar 03, 2014 743 `````` `````` Raniere Silva committed Sep 02, 2014 744 745 746 747 748 ``````The maximum value rises and falls perfectly smoothly, while the minimum seems to be a step function. Neither result seems particularly likely, so either there's a mistake in our calculations or something is wrong with our data. `````` valiseverywhere committed Jun 20, 2016 749 ``````This insight would have been difficult to reach by `````` jstapleton committed Mar 05, 2016 750 ``````examining the data without visualization tools. `````` Greg Wilson committed Mar 03, 2014 751 `````` `````` Azalee Bostroem committed May 09, 2015 752 ``````You can group similar plots in a single figure using subplots. `````` Azalee Bostroem committed May 09, 2015 753 ``````This script below uses a number of new commands. The function `matplotlib.pyplot.figure()` `````` Azalee Bostroem committed May 09, 2015 754 ``````creates a space into which we will place all of our plots. The parameter `figsize` `````` Azalee Bostroem committed May 09, 2015 755 ``````tells Python how big to make this space. Each subplot is placed into the figure using `````` Greg Wilson committed Sep 05, 2016 756 ``````its `add_subplot` [method]({{ page.root }}/reference/#method). The `add_subplot` method takes 3 parameters. The first denotes `````` Azalee Bostroem committed May 09, 2015 757 ``````how many total rows of subplots there are, the second parameter refers to the `````` valiseverywhere committed Jun 13, 2016 758 ``````total number of subplot columns, and the final parameter denotes which subplot `````` Elliott Sales de Andrade committed Jan 27, 2016 759 760 761 ``````your variable is referencing (left-to-right, top-to-bottom). Each subplot is stored in a different variable (`axes1`, `axes2`, `axes3`). Once a subplot is created, the axes can be titled using the `set_xlabel()` command (or `set_ylabel()`). `````` W. Trevor King committed Apr 09, 2015 762 ``````Here are our three plots side by side: `````` Greg Wilson committed Mar 03, 2014 763 `````` `````` Greg Wilson committed Jun 22, 2016 764 ``````~~~ `````` W. Trevor King committed Apr 09, 2015 765 766 ``````import numpy import matplotlib.pyplot `````` Greg Wilson committed Mar 03, 2014 767 `````` `````` W. Trevor King committed Apr 09, 2015 768 ``````data = numpy.loadtxt(fname='inflammation-01.csv', delimiter=',') `````` Greg Wilson committed Mar 03, 2014 769 `````` `````` W. Trevor King committed Apr 09, 2015 770 ``````fig = matplotlib.pyplot.figure(figsize=(10.0, 3.0)) `````` Greg Wilson committed Mar 03, 2014 771 `````` `````` Andrew Lonsdale committed Feb 13, 2015 772 773 774 ``````axes1 = fig.add_subplot(1, 3, 1) axes2 = fig.add_subplot(1, 3, 2) axes3 = fig.add_subplot(1, 3, 3) `````` Greg Wilson committed Mar 03, 2014 775 `````` `````` Andrew Lonsdale committed Feb 13, 2015 776 ``````axes1.set_ylabel('average') `````` Trevor Bekolay committed Jun 22, 2016 777 ``````axes1.plot(numpy.mean(data, axis=0)) `````` Greg Wilson committed Mar 03, 2014 778 `````` `````` Andrew Lonsdale committed Feb 13, 2015 779 ``````axes2.set_ylabel('max') `````` Trevor Bekolay committed Jun 22, 2016 780 ``````axes2.plot(numpy.max(data, axis=0)) `````` Greg Wilson committed Mar 03, 2014 781 `````` `````` Andrew Lonsdale committed Feb 13, 2015 782 ``````axes3.set_ylabel('min') `````` Trevor Bekolay committed Jun 22, 2016 783 ``````axes3.plot(numpy.min(data, axis=0)) `````` Andrew Lonsdale committed Feb 13, 2015 784 785 `````` fig.tight_layout() `````` Andrew Lonsdale committed Feb 13, 2015 786 `````` `````` Elliott Sales de Andrade committed Jan 22, 2016 787 ``````matplotlib.pyplot.show() `````` Greg Wilson committed Dec 03, 2014 788 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 789 ``````{: .python} `````` Greg Wilson committed Mar 03, 2014 790 `````` `````` Greg Wilson committed Jul 20, 2016 791 ``````![The Previous Plots as Subplots](../fig/01-numpy_80_0.png) `````` Greg Wilson committed Mar 03, 2014 792 `````` `````` Greg Wilson committed Sep 05, 2016 793 ``````The [call]({{ page.root }}/reference/#function-call) to `loadtxt` reads our data, `````` Raniere Silva committed Sep 02, 2014 794 795 ``````and the rest of the program tells the plotting library how large we want the figure to be, `````` Elliott Sales de Andrade committed Jan 27, 2016 796 ``````that we're creating three subplots, `````` Raniere Silva committed Sep 02, 2014 797 798 799 ``````what to draw for each one, and that we want a tight layout. (Perversely, `````` Andrew Lonsdale committed Feb 13, 2015 800 ``````if we leave out that call to `fig.tight_layout()`, `````` Raniere Silva committed Sep 02, 2014 801 ``````the graphs will actually be squeezed together more closely.) `````` Greg Wilson committed Mar 03, 2014 802 `````` `````` Greg Wilson committed Jun 22, 2016 803 ``````> ## Scientists Dislike Typing `````` Trevor Bekolay committed May 05, 2015 804 805 806 807 808 809 810 ``````> > We will always use the syntax `import numpy` to import NumPy. > However, in order to save typing, it is > [often suggested](http://www.scipy.org/getting-started.html#an-example-script) > to make a shortcut like so: `import numpy as np`. > If you ever see Python code online using a NumPy function with `np` > (for example, `np.loadtxt(...)`), it's because they've used this shortcut. `````` valiseverywhere committed Jan 06, 2017 811 ``````> When working with other people, it is important to agree on a convention of how common libraries are imported. `````` valiseverywhere committed Jan 06, 2017 812 ``````{: .callout} `````` Greg Wilson committed Jun 22, 2016 813 ``````> ## Check Your Understanding `````` mboisson committed May 15, 2015 814 815 816 ``````> > Draw diagrams showing what variables refer to what values after each statement in the following program: > `````` Greg Wilson committed Jun 22, 2016 817 ``````> ~~~ `````` mboisson committed May 15, 2015 818 819 820 821 822 ``````> mass = 47.5 &``````