01-numpy.md 33.7 KB
Newer Older
 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 `````` `````` 34 ``````The line below [assigns](reference.html#assignment) the value `55` to a [variable](reference.html#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`. `````` 43 ``````Python's variables must begin with a letter and are [case sensitive](reference.html#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 146 ``````> Variable Type Data/Info > -------------------------------- > numpy module kages/numpy/__init__.py'> > weight_kg float 100.0 > weight_lb float 126.5 > ~~~ `````` Greg Wilson committed Jun 22, 2016 147 148 ``````> {: .output} {: .callout} `````` Benjamin Laken committed Nov 09, 2015 149 `````` `````` devendra1810 committed Jul 19, 2016 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 ``````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, specialized tools built up from these basic units live in [libraries](reference.html#library) that can be called upon when needed. In order to load our inflammation data, we need to access ([import](reference.html#import) in Python terminology) 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 171 172 ``````much like a new piece of equipment adds functionality to a lab space. Just like in the lab, importing too many libraries can sometimes complicate and slow down your programs - so we only import what we need for each program. `````` Valentina Staneva committed Jul 31, 2017 173 ``````Once we've imported the library, `````` devendra1810 committed Jul 19, 2016 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 ``````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} The expression `numpy.loadtxt(...)` is a [function call](reference.html#function-call) that asks Python to run the [function](reference.html#function) `loadtxt` which belongs to the `numpy` library. This [dotted notation](reference.html#dotted-notation) is used everywhere in Python to refer to the parts of things as `thing.component`. `numpy.loadtxt` has two [parameters](reference.html#parameter): the name of the file we want to read, and the [delimiter](reference.html#delimiter) that separates values on a line. These both need to be character strings (or [strings](reference.html#string) for short), 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, `````` 217 ``````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 218 ``````to a variable using the same syntax. Let's re-run `numpy.loadtxt` and save its result: `````` Greg Wilson committed Mar 03, 2014 219 `````` `````` Greg Wilson committed Jun 22, 2016 220 ``````~~~ `````` Greg Wilson committed Dec 03, 2014 221 222 ``````data = numpy.loadtxt(fname='inflammation-01.csv', delimiter=',') ~~~ `````` Greg Wilson committed Jun 22, 2016 223 ``````{: .python} `````` Greg Wilson committed Mar 03, 2014 224 `````` `````` Raniere Silva committed Sep 02, 2014 225 226 227 ``````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 228 `````` `````` Greg Wilson committed Jun 22, 2016 229 ``````~~~ `````` Raniere Silva committed Aug 20, 2015 230 ``````print(data) `````` Greg Wilson committed Dec 03, 2014 231 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 232 233 234 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 235 ``````[[ 0. 0. 1. ..., 3. 0. 0.] `````` Greg Wilson committed Mar 03, 2014 236 237 `````` [ 0. 1. 2. ..., 1. 0. 1.] [ 0. 1. 1. ..., 2. 1. 1.] `````` 238 `````` ..., `````` Greg Wilson committed Mar 03, 2014 239 240 241 `````` [ 0. 1. 1. ..., 1. 1. 1.] [ 0. 0. 0. ..., 0. 2. 0.] [ 0. 0. 1. ..., 1. 1. 0.]] `````` Greg Wilson committed Dec 03, 2014 242 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 243 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 244 `````` `````` Raniere Silva committed Sep 02, 2014 245 246 247 ``````Now that our data is in memory, we can start doing things with it. First, `````` Greg Wilson committed Sep 05, 2016 248 ``````let's ask what [type]({{ page.root }}/reference/#type) of thing `data` refers to: `````` Greg Wilson committed Mar 03, 2014 249 `````` `````` Greg Wilson committed Jun 22, 2016 250 ``````~~~ `````` Raniere Silva committed Aug 20, 2015 251 ``````print(type(data)) `````` Greg Wilson committed Dec 03, 2014 252 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 253 254 255 ``````{: .python} ~~~ `````` Trevor Bekolay committed Aug 28, 2015 256 `````` `````` Greg Wilson committed Dec 03, 2014 257 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 258 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 259 `````` `````` 260 261 262 263 264 265 ``````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 266 ``````> ## Data Type `````` 267 268 269 270 ``````> > 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 271 ``````> We can also find out the type `````` 272 273 ``````> of the data contained in the NumPy array. > `````` Greg Wilson committed Jun 22, 2016 274 ``````> ~~~ `````` 275 276 ``````> print(data.dtype) > ~~~ `````` Greg Wilson committed Jun 22, 2016 277 278 279 ``````> {: .python} > > ~~~ `````` 280 281 ``````> dtype('float64') > ~~~ `````` Greg Wilson committed Jun 22, 2016 282 ``````> {: .output} `````` 283 284 ``````> > This tells us that the NumPy array's elements are `````` Greg Wilson committed Sep 05, 2016 285 ``````> [floating-point numbers]({{ page.root }}/reference/#floating-point number). `````` Greg Wilson committed Jun 22, 2016 286 ``````{: .callout} `````` 287 `````` `````` Bree Norlander committed Jul 19, 2017 288 ``````With this command we can see the array's [shape]({{ page.root }}/reference/#shape): `````` Greg Wilson committed Mar 03, 2014 289 `````` `````` Greg Wilson committed Jun 22, 2016 290 ``````~~~ `````` Raniere Silva committed Aug 20, 2015 291 ``````print(data.shape) `````` Greg Wilson committed Dec 03, 2014 292 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 293 294 295 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 296 297 ``````(60, 40) ~~~ `````` Greg Wilson committed Jun 22, 2016 298 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 299 `````` `````` Azalee Bostroem committed May 09, 2015 300 301 ``````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 302 ``````created information about the array, called [members]({{ page.root }}/reference/#member) or `````` Azalee Bostroem committed May 09, 2015 303 304 ``````attributes. This extra information describes `data` in the same way an adjective describes a noun. `````` Bartosz T committed Jun 13, 2016 305 ```````data.shape` is an attribute of `data` which describes the dimensions of `data`. `````` Azalee Bostroem committed May 09, 2015 306 ``````We use the same dotted notation for the attributes of variables `````` Raniere Silva committed Sep 02, 2014 307 308 ``````that we use for the functions in libraries because they have the same part-and-whole relationship. `````` Greg Wilson committed Mar 03, 2014 309 `````` `````` Azalee Bostroem committed May 09, 2015 310 ``````If we want to get a single number from the array, `````` Greg Wilson committed Sep 05, 2016 311 ``````we must provide an [index]({{ page.root }}/reference/#index) in square brackets, `````` Dustin Lang committed Jan 27, 2017 312 ``````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 313 `````` `````` Greg Wilson committed Jun 22, 2016 314 ``````~~~ `````` Raniere Silva committed Aug 20, 2015 315 ``````print('first value in data:', data[0, 0]) `````` Greg Wilson committed Dec 03, 2014 316 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 317 318 319 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 320 321 ``````first value in data: 0.0 ~~~ `````` Greg Wilson committed Jun 22, 2016 322 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 323 `````` `````` Greg Wilson committed Jun 22, 2016 324 ``````~~~ `````` Raniere Silva committed Aug 20, 2015 325 ``````print('middle value in data:', data[30, 20]) `````` Greg Wilson committed Dec 03, 2014 326 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 327 328 329 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 330 331 ``````middle value in data: 13.0 ~~~ `````` Greg Wilson committed Jun 22, 2016 332 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 333 `````` `````` Raniere Silva committed Sep 02, 2014 334 335 ``````The expression `data[30, 20]` may not surprise you, but `data[0, 0]` might. `````` Tim Millar committed Apr 26, 2017 336 ``````Programming languages like Fortran, MATLAB and R start counting at 1, `````` Raniere Silva committed Sep 02, 2014 337 338 ``````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 339 340 341 342 343 ``````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 344 ``````As a result, `````` Greg Wilson committed Jul 10, 2016 345 ``````if we have an M×N array in Python, `````` Raniere Silva committed Sep 02, 2014 346 347 348 349 350 351 ``````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 352 353 ``````![Zero Index](../fig/python-zero-index.png) `````` Greg Wilson committed Jun 22, 2016 354 ``````> ## In the Corner `````` Raniere Silva committed Sep 02, 2014 355 356 357 358 359 360 ``````> > 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. `````` 361 ``````> The indices are (row, column) instead of (column, row) for the same reason, `````` Greg Wilson committed Sep 08, 2014 362 ``````> which can be confusing when plotting data. `````` Greg Wilson committed Jun 22, 2016 363 ``````{: .callout} `````` Raniere Silva committed Sep 02, 2014 364 365 366 367 368 `````` 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 369 ``````for the first four patients (rows) like this: `````` Greg Wilson committed Mar 03, 2014 370 `````` `````` Greg Wilson committed Jun 22, 2016 371 ``````~~~ `````` Raniere Silva committed Aug 20, 2015 372 ``````print(data[0:4, 0:10]) `````` Greg Wilson committed Dec 03, 2014 373 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 374 375 376 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 377 ``````[[ 0. 0. 1. 3. 1. 2. 4. 7. 8. 3.] `````` Greg Wilson committed Mar 03, 2014 378 379 380 `````` [ 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 381 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 382 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 383 `````` `````` Greg Wilson committed Sep 05, 2016 384 ``````The [slice]({{ page.root }}/reference/#slice) `0:4` means, `````` Raniere Silva committed Sep 02, 2014 385 386 387 388 389 390 ``````"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 391 `````` `````` Greg Wilson committed Jun 22, 2016 392 ``````~~~ `````` Raniere Silva committed Aug 20, 2015 393 ``````print(data[5:10, 0:10]) `````` Greg Wilson committed Dec 03, 2014 394 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 395 396 397 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 398 ``````[[ 0. 0. 1. 2. 2. 4. 2. 1. 6. 4.] `````` Greg Wilson committed Mar 03, 2014 399 400 401 402 `````` [ 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 403 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 404 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 405 `````` `````` Raniere Silva committed Sep 02, 2014 406 407 408 409 410 411 412 413 ``````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 414 `````` `````` Greg Wilson committed Jun 22, 2016 415 ``````~~~ `````` Greg Wilson committed Dec 03, 2014 416 ``````small = data[:3, 36:] `````` Raniere Silva committed Aug 20, 2015 417 418 ``````print('small is:') print(small) `````` Greg Wilson committed Dec 03, 2014 419 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 420 421 422 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 423 ``````small is: `````` Greg Wilson committed Mar 03, 2014 424 425 426 ``````[[ 2. 3. 0. 0.] [ 1. 1. 0. 1.] [ 2. 2. 1. 1.]] `````` Greg Wilson committed Dec 03, 2014 427 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 428 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 429 `````` `````` Raniere Silva committed Sep 02, 2014 430 ``````Arrays also know how to perform common mathematical operations on their values. `````` Greg Wilson committed Dec 03, 2014 431 432 433 434 435 ``````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 436 `````` `````` Greg Wilson committed Jun 22, 2016 437 ``````~~~ `````` Greg Wilson committed Dec 03, 2014 438 439 ``````doubledata = data * 2.0 ~~~ `````` Greg Wilson committed Jun 22, 2016 440 ``````{: .python} `````` Trevor Bekolay committed Sep 29, 2014 441 `````` `````` Greg Wilson committed Dec 03, 2014 442 443 ``````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 444 `````` `````` Greg Wilson committed Jun 22, 2016 445 ``````~~~ `````` Raniere Silva committed Aug 20, 2015 446 447 448 449 ``````print('original:') print(data[:3, 36:]) print('doubledata:') print(doubledata[:3, 36:]) `````` Greg Wilson committed Dec 03, 2014 450 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 451 452 453 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 454 ``````original: `````` Trevor Bekolay committed Sep 29, 2014 455 456 457 458 459 460 461 ``````[[ 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 462 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 463 ``````{: .output} `````` Trevor Bekolay committed Sep 29, 2014 464 `````` `````` Greg Wilson committed Dec 03, 2014 465 466 ``````If, instead of taking an array and doing arithmetic with a single value (as above) `````` Azalee Bostroem committed May 09, 2015 467 ``````you did the arithmetic operation with another array of the same shape, `````` Greg Wilson committed Dec 03, 2014 468 469 ``````the operation will be done on corresponding elements of the two arrays. Thus: `````` Trevor Bekolay committed Sep 29, 2014 470 `````` `````` Greg Wilson committed Jun 22, 2016 471 ``````~~~ `````` Greg Wilson committed Dec 03, 2014 472 473 ``````tripledata = doubledata + data ~~~ `````` Greg Wilson committed Jun 22, 2016 474 ``````{: .python} `````` Trevor Bekolay committed Sep 29, 2014 475 `````` `````` Johnny Lin committed Sep 22, 2014 476 477 478 ``````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 479 ``````~~~ `````` Raniere Silva committed Aug 20, 2015 480 481 ``````print('tripledata:') print(tripledata[:3, 36:]) `````` Greg Wilson committed Dec 03, 2014 482 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 483 484 485 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 486 ``````tripledata: `````` Trevor Bekolay committed Sep 29, 2014 487 488 489 ``````[[ 6. 9. 0. 0.] [ 3. 3. 0. 3.] [ 6. 6. 3. 3.]] `````` Greg Wilson committed Dec 03, 2014 490 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 491 ``````{: .output} `````` Trevor Bekolay committed Sep 29, 2014 492 `````` `````` Johnny Lin committed Sep 22, 2014 493 ``````Often, we want to do more than add, subtract, multiply, and divide values of data. `````` Trevor Bekolay committed Jun 22, 2016 494 ``````NumPy knows how to do more complex operations on arrays. `````` Raniere Silva committed Sep 02, 2014 495 496 ``````If we want to find the average inflammation for all patients on all days, for example, `````` Trevor Bekolay committed Jun 22, 2016 497 ``````we can ask NumPy to compute `data`'s mean value: `````` Greg Wilson committed Mar 03, 2014 498 `````` `````` Greg Wilson committed Jun 22, 2016 499 ``````~~~ `````` Trevor Bekolay committed Jun 22, 2016 500 ``````print(numpy.mean(data)) `````` Greg Wilson committed Dec 03, 2014 501 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 502 503 504 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 505 506 ``````6.14875 ~~~ `````` Greg Wilson committed Jun 22, 2016 507 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 508 `````` `````` Greg Wilson committed Sep 05, 2016 509 510 ```````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 511 512 513 ``````If variables are nouns, functions are verbs: they do things with variables. `````` Greg Wilson committed Jun 22, 2016 514 ``````> ## Not All Functions Have Input `````` Trevor Bekolay committed Jun 22, 2016 515 516 517 ``````> > Generally, a function uses inputs to produce outputs. > However, some functions produce outputs without `````` Trevor Bekolay committed Jun 22, 2016 518 519 ``````> needing any input. For example, checking the current time > doesn't require any input. `````` Trevor Bekolay committed Jun 22, 2016 520 ``````> `````` Greg Wilson committed Jun 22, 2016 521 ``````> ~~~ `````` Trevor Bekolay committed Jun 22, 2016 522 523 ``````> import time > print(time.ctime()) `````` Trevor Bekolay committed Jun 22, 2016 524 ``````> ~~~ `````` Greg Wilson committed Jun 22, 2016 525 526 527 ``````> {: .python} > > ~~~ `````` Trevor Bekolay committed Jun 22, 2016 528 ``````> 'Sat Mar 26 13:07:33 2016' `````` Trevor Bekolay committed Jun 22, 2016 529 ``````> ~~~ `````` Greg Wilson committed Jun 22, 2016 530 ``````> {: .output} `````` Trevor Bekolay committed Jun 22, 2016 531 532 533 534 ``````> > 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 535 ``````{: .callout} `````` Trevor Bekolay committed Jun 22, 2016 536 537 538 `````` 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 539 540 ``````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 541 `````` `````` Greg Wilson committed Jun 22, 2016 542 ``````~~~ `````` Trevor Bekolay committed Jun 22, 2016 543 ``````maxval, minval, stdval = numpy.max(data), numpy.min(data), numpy.std(data) `````` Trevor Bekolay committed Jun 21, 2016 544 `````` `````` Alistair Walsh committed Jun 21, 2016 545 546 547 ``````print('maximum inflammation:', maxval) print('minimum inflammation:', minval) print('standard deviation:', stdval) `````` Greg Wilson committed Dec 03, 2014 548 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 549 550 551 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 552 ``````maximum inflammation: 20.0 `````` Greg Wilson committed Mar 03, 2014 553 554 ``````minimum inflammation: 0.0 standard deviation: 4.61383319712 `````` Greg Wilson committed Dec 03, 2014 555 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 556 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 557 `````` `````` Greg Wilson committed Jun 22, 2016 558 ``````> ## Mystery Functions in IPython `````` Benjamin Laken committed Dec 04, 2015 559 ``````> `````` Trevor Bekolay committed Jun 22, 2016 560 561 ``````> 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 562 ``````> If you type the name of something followed by a dot, then you can use tab completion `````` Trevor Bekolay committed Jun 22, 2016 563 564 565 566 ``````> (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 567 ``````{: .callout} `````` Trevor Bekolay committed Jun 22, 2016 568 569 `````` When analyzing data, though, `````` Raniere Silva committed Sep 02, 2014 570 571 572 ``````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 573 ``````One way to do this is to create a new temporary array of the data we want, `````` Raniere Silva committed Sep 02, 2014 574 ``````then ask it to do the calculation: `````` Greg Wilson committed Mar 03, 2014 575 `````` `````` Greg Wilson committed Jun 22, 2016 576 ``````~~~ `````` Dustin Lang committed Jan 27, 2017 577 ``````patient_0 = data[0, :] # 0 on the first axis (rows), everything on the second (columns) `````` Raniere Silva committed Aug 20, 2015 578 ``````print('maximum inflammation for patient 0:', patient_0.max()) `````` Greg Wilson committed Dec 03, 2014 579 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 580 581 582 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 583 584 ``````maximum inflammation for patient 0: 18.0 ~~~ `````` Greg Wilson committed Jun 22, 2016 585 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 586 `````` `````` valiseverywhere committed Jun 20, 2016 587 ``````Everything in a line of code following the '#' symbol is a `````` Dustin Lang committed Jan 27, 2017 588 ``````[comment]({{ page.root }}/reference/#comment) that is ignored by Python. `````` valiseverywhere committed Jun 20, 2016 589 ``````Comments allow programmers to leave explanatory notes for other `````` jstapleton committed Mar 05, 2016 590 591 ``````programmers or their future selves. `````` Raniere Silva committed Sep 02, 2014 592 ``````We don't actually need to store the row in a variable of its own. `````` Trevor Bekolay committed Jun 22, 2016 593 ``````Instead, we can combine the selection and the function call: `````` Greg Wilson committed Mar 03, 2014 594 `````` `````` Greg Wilson committed Jun 22, 2016 595 ``````~~~ `````` Trevor Bekolay committed Jun 22, 2016 596 ``````print('maximum inflammation for patient 2:', numpy.max(data[2, :])) `````` Greg Wilson committed Dec 03, 2014 597 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 598 599 600 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 601 602 ``````maximum inflammation for patient 2: 19.0 ~~~ `````` Greg Wilson committed Jun 22, 2016 603 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 604 `````` `````` Valentina Staneva committed Jul 18, 2016 605 ``````What if we need the maximum inflammation for each patient over all days (as in the `````` 606 607 608 ``````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 609 `````` `````` Greg Wilson committed Jul 20, 2016 610 ``````![Operations Across Axes](../fig/python-operations-across-axes.png) `````` Greg Wilson committed Mar 03, 2014 611 `````` `````` Raniere Silva committed Sep 02, 2014 612 ``````To support this, `````` Trevor Bekolay committed Jun 22, 2016 613 ``````most array functions allow us to specify the axis we want to work on. `````` 614 ``````If we ask for the average across axis 0 (rows in our 2D example), `````` Raniere Silva committed Sep 02, 2014 615 ``````we get: `````` Greg Wilson committed Mar 03, 2014 616 `````` `````` Greg Wilson committed Jun 22, 2016 617 ``````~~~ `````` Trevor Bekolay committed Jun 22, 2016 618 ``````print(numpy.mean(data, axis=0)) `````` Greg Wilson committed Dec 03, 2014 619 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 620 621 622 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 623 ``````[ 0. 0.45 1.11666667 1.75 2.43333333 3.15 `````` Greg Wilson committed Mar 03, 2014 624 625 626 627 628 629 630 `````` 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 631 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 632 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 633 `````` `````` Raniere Silva committed Sep 02, 2014 634 635 ``````As a quick check, we can ask this array what its shape is: `````` Greg Wilson committed Mar 03, 2014 636 `````` `````` Greg Wilson committed Jun 22, 2016 637 ``````~~~ `````` Trevor Bekolay committed Jun 22, 2016 638 ``````print(numpy.mean(data, axis=0).shape) `````` Greg Wilson committed Dec 03, 2014 639 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 640 641 642 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 643 644 ``````(40,) ~~~ `````` Greg Wilson committed Jun 22, 2016 645 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 646 `````` `````` Greg Wilson committed Jul 10, 2016 647 ``````The expression `(40,)` tells us we have an N×1 vector, `````` Raniere Silva committed Sep 02, 2014 648 ``````so this is the average inflammation per day for all patients. `````` 649 ``````If we average across axis 1 (columns in our 2D example), we get: `````` Greg Wilson committed Mar 03, 2014 650 `````` `````` Greg Wilson committed Jun 22, 2016 651 ``````~~~ `````` Trevor Bekolay committed Jun 22, 2016 652 ``````print(numpy.mean(data, axis=1)) `````` Greg Wilson committed Dec 03, 2014 653 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 654 655 656 ``````{: .python} ~~~ `````` Greg Wilson committed Dec 03, 2014 657 ``````[ 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 658 659 660 661 662 `````` 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 663 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 664 ``````{: .output} `````` Greg Wilson committed Mar 03, 2014 665 `````` `````` Raniere Silva committed Sep 02, 2014 666 667 668 669 670 ``````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 671 ``````Visualization deserves an entire lecture (of course) of its own, `````` Azalee Bostroem committed May 09, 2015 672 ``````but we can explore a few features of Python's `matplotlib` library here. `````` Greg Wilson committed Dec 03, 2014 673 674 ``````While there is no "official" plotting library, this package is the de facto standard. `````` Raniere Silva committed Sep 02, 2014 675 676 677 ``````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 678 `````` `````` Greg Wilson committed Jun 22, 2016 679 ``````~~~ `````` Azalee Bostroem committed May 09, 2015 680 ``````import matplotlib.pyplot `````` Konrad Förstner committed Oct 18, 2016 681 ``````image = matplotlib.pyplot.imshow(data) `````` Elliott Sales de Andrade committed Jan 22, 2016 682 ``````matplotlib.pyplot.show() `````` Greg Wilson committed Dec 03, 2014 683 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 684 ``````{: .python} `````` Greg Wilson committed Mar 03, 2014 685 `````` `````` Greg Wilson committed Jul 20, 2016 686 ``````![Heatmap of the Data](../fig/01-numpy_71_0.png) `````` Greg Wilson committed Mar 03, 2014 687 `````` `````` Raniere Silva committed Sep 02, 2014 688 689 690 ``````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 691 `````` `````` Greg Wilson committed Jun 22, 2016 692 ``````> ## Some IPython Magic `````` Damien Irving committed May 26, 2015 693 694 695 696 ``````> > 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 697 ``````> in the notebook when `show()` is called: `````` Damien Irving committed May 26, 2015 698 ``````> `````` Greg Wilson committed Jun 22, 2016 699 ``````> ~~~ `````` Nicola Soranzo committed May 02, 2017 700 ``````> %matplotlib inline `````` Damien Irving committed May 26, 2015 701 ``````> ~~~ `````` Greg Wilson committed Jun 22, 2016 702 ``````> {: .python} `````` Trevor Bekolay committed Jan 18, 2016 703 ``````> `````` shiffer1 committed Jun 25, 2015 704 705 ``````> The `%` indicates an IPython magic function - > a function that is only valid within the notebook environment. `````` Damien Irving committed May 26, 2015 706 ``````> Note that you only have to execute this function once per notebook. `````` Greg Wilson committed Jun 22, 2016 707 ``````{: .callout} `````` Damien Irving committed May 26, 2015 708 `````` `````` Raniere Silva committed Sep 02, 2014 709 ``````Let's take a look at the average inflammation over time: `````` Greg Wilson committed Mar 03, 2014 710 `````` `````` Greg Wilson committed Jun 22, 2016 711 ``````~~~ `````` Trevor Bekolay committed Jun 22, 2016 712 ``````ave_inflammation = numpy.mean(data, axis=0) `````` Damien Irving committed May 26, 2015 713 ``````ave_plot = matplotlib.pyplot.plot(ave_inflammation) `````` Elliott Sales de Andrade committed Jan 22, 2016 714 ``````matplotlib.pyplot.show() `````` Greg Wilson committed Dec 03, 2014 715 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 716 ``````{: .python} `````` Greg Wilson committed Mar 03, 2014 717 `````` `````` Greg Wilson committed Jul 20, 2016 718 ``````![Average Inflammation Over Time](../fig/01-numpy_73_0.png) `````` Greg Wilson committed Mar 03, 2014 719 `````` `````` Raniere Silva committed Sep 02, 2014 720 721 ``````Here, we have put the average per day across all patients in the variable `ave_inflammation`, `````` Damien Irving committed May 26, 2015 722 ``````then asked `matplotlib.pyplot` to create and display a line graph of those values. `````` Raniere Silva committed Sep 02, 2014 723 724 725 726 727 ``````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 728 `````` `````` Greg Wilson committed Jun 22, 2016 729 ``````~~~ `````` Trevor Bekolay committed Jun 22, 2016 730 ``````max_plot = matplotlib.pyplot.plot(numpy.max(data, axis=0)) `````` Elliott Sales de Andrade committed Jan 22, 2016 731 ``````matplotlib.pyplot.show() `````` Greg Wilson committed Dec 03, 2014 732 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 733 ``````{: .python} `````` Greg Wilson committed Mar 03, 2014 734 `````` `````` Greg Wilson committed Jul 20, 2016 735 ``````![Maximum Value Along The First Axis](../fig/01-numpy_75_1.png) `````` Greg Wilson committed Dec 03, 2014 736 `````` `````` Greg Wilson committed Jun 22, 2016 737 ``````~~~ `````` Trevor Bekolay committed Jun 22, 2016 738 ``````min_plot = matplotlib.pyplot.plot(numpy.min(data, axis=0)) `````` Elliott Sales de Andrade committed Jan 22, 2016 739 ``````matplotlib.pyplot.show() `````` Greg Wilson committed Dec 03, 2014 740 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 741 ``````{: .python} `````` Greg Wilson committed Apr 09, 2014 742 `````` `````` Greg Wilson committed Jul 20, 2016 743 ``````![Minimum Value Along The First Axis](../fig/01-numpy_75_3.png) `````` Greg Wilson committed Mar 03, 2014 744 `````` `````` Raniere Silva committed Sep 02, 2014 745 746 747 748 749 ``````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 750 ``````This insight would have been difficult to reach by `````` jstapleton committed Mar 05, 2016 751 ``````examining the data without visualization tools. `````` Greg Wilson committed Mar 03, 2014 752 `````` `````` Azalee Bostroem committed May 09, 2015 753 ``````You can group similar plots in a single figure using subplots. `````` Azalee Bostroem committed May 09, 2015 754 ``````This script below uses a number of new commands. The function `matplotlib.pyplot.figure()` `````` Azalee Bostroem committed May 09, 2015 755 ``````creates a space into which we will place all of our plots. The parameter `figsize` `````` Azalee Bostroem committed May 09, 2015 756 ``````tells Python how big to make this space. Each subplot is placed into the figure using `````` Greg Wilson committed Sep 05, 2016 757 ``````its `add_subplot` [method]({{ page.root }}/reference/#method). The `add_subplot` method takes 3 parameters. The first denotes `````` Azalee Bostroem committed May 09, 2015 758 ``````how many total rows of subplots there are, the second parameter refers to the `````` valiseverywhere committed Jun 13, 2016 759 ``````total number of subplot columns, and the final parameter denotes which subplot `````` Elliott Sales de Andrade committed Jan 27, 2016 760 761 762 ``````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 763 ``````Here are our three plots side by side: `````` Greg Wilson committed Mar 03, 2014 764 `````` `````` Greg Wilson committed Jun 22, 2016 765 ``````~~~ `````` W. Trevor King committed Apr 09, 2015 766 767 ``````import numpy import matplotlib.pyplot `````` Greg Wilson committed Mar 03, 2014 768 `````` `````` W. Trevor King committed Apr 09, 2015 769 ``````data = numpy.loadtxt(fname='inflammation-01.csv', delimiter=',') `````` Greg Wilson committed Mar 03, 2014 770 `````` `````` W. Trevor King committed Apr 09, 2015 771 ``````fig = matplotlib.pyplot.figure(figsize=(10.0, 3.0)) `````` Greg Wilson committed Mar 03, 2014 772 `````` `````` Andrew Lonsdale committed Feb 13, 2015 773 774 775 ``````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 776 `````` `````` Andrew Lonsdale committed Feb 13, 2015 777 ``````axes1.set_ylabel('average') `````` Trevor Bekolay committed Jun 22, 2016 778 ``````axes1.plot(numpy.mean(data, axis=0)) `````` Greg Wilson committed Mar 03, 2014 779 `````` `````` Andrew Lonsdale committed Feb 13, 2015 780 ``````axes2.set_ylabel('max') `````` Trevor Bekolay committed Jun 22, 2016 781 ``````axes2.plot(numpy.max(data, axis=0)) `````` Greg Wilson committed Mar 03, 2014 782 `````` `````` Andrew Lonsdale committed Feb 13, 2015 783 ``````axes3.set_ylabel('min') `````` Trevor Bekolay committed Jun 22, 2016 784 ``````axes3.plot(numpy.min(data, axis=0)) `````` Andrew Lonsdale committed Feb 13, 2015 785 786 `````` fig.tight_layout() `````` Andrew Lonsdale committed Feb 13, 2015 787 `````` `````` Elliott Sales de Andrade committed Jan 22, 2016 788 ``````matplotlib.pyplot.show() `````` Greg Wilson committed Dec 03, 2014 789 ``````~~~ `````` Greg Wilson committed Jun 22, 2016 790 ``````{: .python} `````` Greg Wilson committed Mar 03, 2014 791 `````` `````` Greg Wilson committed Jul 20, 2016 792 ``````![The Previous Plots as Subplots](../fig/01-numpy_80_0.png) `````` Greg Wilson committed Mar 03, 2014 793 `````` `````` Greg Wilson committed Sep 05, 2016 794 ``````The [call]({{ page.root }}/reference/#function-call) to `loadtxt` reads our data, `````` Raniere Silva committed Sep 02, 2014 795 796 ``````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 797 ``````that we're creating three subplots, `````` Raniere Silva committed Sep 02, 2014 798 799 800 ``````what to draw for each one, and that we want a tight layout. (Perversely, `````` Andrew Lonsdale committed Feb 13, 2015 801 ``````if we leave out that call to `fig.tight_layout()`, `````` Raniere Silva committed Sep 02, 2014 802 ``````the graphs will actually be squeezed together more closely.) `````` Greg Wilson committed Mar 03, 2014 803 `````` `````` Greg Wilson committed Jun 22, 2016 804 ``````> ## Scientists Dislike Typing `````` Trevor Bekolay committed May 05, 2015 805 806 807 808 809 810 811 ``````> > 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 812 ``````> When working with other people, it is important to agree on a convention of how common libraries are imported. `````` valiseverywhere committed Jan 06, 2017 813 ``````{: .callout} `````` Greg Wilson committed Jun 22, 2016 814 ``````> ## Check Your Understanding `````` mboisson committed May 15, 2015 815 816 817 ``````> > Draw diagrams showing what variables refer to what values after each statement in the following program: > `````` Greg Wilson committed Jun 22, 2016 818 ``````> ~~~ `````` mboisson committed May 15, 2015 819 820 821 822 823 ``````> mass = 47.5 > age = 122 > mass = mass * 2.0 > age = age - 20 > ~~~ `````` Greg Wilson committed Jun 22, 2016 824 825 ``````> {: .python} {: .challenge} `````` mboisson committed May 15, 2015 826 `````` `````` Greg Wilson committed Jun 22, 2016 827 ``````> ## Sorting Out References `````` mboisson committed May 15, 2015 828 829 830 ``````> > What does the following program print out? > `````` Greg Wilson committed Jun 22, 2016 831 ``````> ~~~ `````` mboisson committed May 15, 2015 832 833 ``````> first, second = 'Grace', 'Hopper' > third, fourth = second, first `````` Raniere Silva committed Aug 20, 2015 834 ``````> print(third, fourth) `````` mboisson committed May 15, 2015 835 ``````> ~~~ ``````