Commit 95cbcfdbc30a24dc35021db32f3d423918970edd

Authored by Rémi Emonet
1 parent a39a799c7b
Exists in master

cm8

Showing 3 changed files with 395 additions and 0 deletions

cours-08.html View file @ 95cbcfd
  1 +<!DOCTYPE html>
  2 +<html>
  3 + <head>
  4 + <meta charset="utf-8">
  5 + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  6 +
  7 + <title>Informatique 8   (re)matplotlib, numpy broadcasting</title>
  8 + <meta name="cours-n" content="8">
  9 +
  10 + <meta name="author" content="Rémi Emonet">
  11 + <meta name="venue" content="L2SPICHI">
  12 + <meta name="date" content="2018">
  13 + <meta name="affiliation" content="Université Jean Monnet − Laboratoire Hubert Curien">
  14 +
  15 + <style type="text/css">
  16 + .strik{text-decoration: line-through;}
  17 + </style>
  18 +
  19 + <!--
  20 + <script src="deck.js/extensions/includedeck/load.js"></script>
  21 + <script src="extensions/slides-dev.js"></script>
  22 + -->
  23 + <script src="extensions/deck-packed.js"></script>
  24 + <script src="extensions/slides.js"></script>
  25 + <script>go(function() {
  26 + });</script>
  27 + </head>
  28 +
  29 +<body>
  30 +
  31 +<div class="deck-container">
  32 +
  33 + <div class="deck-loading-splash" style="background: black; color: chartreuse;"><span class="vcenter" style="font-size: 30px; font-family: Arial; ">Please wait, while our marmots are preparing the hot chocolate…</span></div>
  34 +
  35 +<section class="smart">
  36 +
  37 +# @chunk: chunks/title.md
  38 +
  39 +# @chunk: chunks/objectives.md
  40 +
  41 +## Informatique <span>{var-cours-n}</span> : Plan {#plan overview}
  42 +- Matplotlib : principes appliqués {matplotlibprinciples}
  43 +- Tableau Numpy : *broadcasting* {broadcast}
  44 +- Matplotlib : 2D {rematplotlibprinciples}
  45 +- Autre {others}
  46 +
  47 +
  48 +
  49 +
  50 +<!-- ######################################## -->
  51 +# @copy:#plan: %+class:inred: .matplotlibprinciples
  52 +
  53 +## Pyplot {libyli}
  54 +- Matplotlib permet de
  55 + - tracer des figures
  56 + - tracer des courbes, histogrammes, etc
  57 + - sauver dans un fichier image
  58 + - afficher de manière interactive
  59 +- Pyplot : `from matplotlib import pyplot as plt`
  60 + - `plt` : pour simplifier les taches simples
  61 +- Quelques fonctions `plt.truc(...)` {libyli}
  62 + - plot, savefig, show, ...
  63 + - xlabel, ylabel, xticks, yticks, xlim, ylim, xscale, yscale, legend, grid, title, ...
  64 + - text, annotate, ...
  65 + - subplot
  66 + - scatter, bar, barh, contour, contourf,
  67 + - imshow, hist, ...
  68 +- <a href="http://matplotlib.org/api/pyplot_summary.html" target="_blank">http://matplotlib.org/api/pyplot_summary.html</a>
  69 +
  70 +# Illustration de Numpy + Matplotlib : affichage des pas (quand on marche)
  71 +- {comment}
  72 + - np.genfromtxt(..., separator=',')n
  73 + - cf prep/steps
  74 +
  75 +## Matplotlib : apparence des courbes
  76 +- Paramètres de base de `plt.plot()`
  77 + - codes pour la couleurs
  78 + - codes pour le type de trait
  79 + - codes pour le type de marqueurs (points)
  80 +- Paramètres nommés
  81 + - pour les éléments ci-dessus (`color`, `linestyle`, `marker`)
  82 + - pour d'autres choses : `markerfacecolor` (couleur des points), `fillstyle` (remplissage sous la courbe), `drawstyle` (comment relier les points : segment oblique, marche, ...), `markersize` (tailles des points), `label` (nom de la courbe), `linewidth` (épaisseur du trait),
  83 +
  84 +
  85 +# @chunk: chunks/doc-plt-plot-show-savefig.md
  86 +# @chunk: chunks/doc-plt-xlabel.md
  87 +# @chunk: chunks/doc-plt-xticks.md
  88 +# @chunk: chunks/doc-plt-xlim.md
  89 +# @chunk: chunks/doc-plt-xscale.md
  90 +# @chunk: chunks/doc-plt-legend.md
  91 +# @chunk: chunks/doc-plt-grid.md
  92 +# @chunk: chunks/doc-plt-title.md
  93 +
  94 +# @chunk: chunks/doc-plt-text.md
  95 +# @chunk: chunks/doc-plt-annotate.md
  96 +
  97 +# @chunk: chunks/doc-plt-subplot.md
  98 +
  99 +# @chunk: chunks/doc-plt-scatter-and-many.md
  100 +# @chunk: chunks/doc-plt-hist.md
  101 +
  102 +
  103 +
  104 +
  105 +
  106 +
  107 +
  108 +
  109 +<!-- ######################################## -->
  110 +# @copy:#plan: %+class:inred: .broadcast
  111 +
  112 +
  113 +# RAPPELS {no-print}
  114 +
  115 +## Opérations élément par élément {libyli}
  116 +- Créons deux tableaux de même dimensions
  117 +```python
  118 +a = np.arange(0, 1000, 100).reshape((2, 5))
  119 +b = np.arange(0, 10).reshape((2, 5))
  120 +
  121 +assert_allclose(a, np.array([[ 0, 100, 200, 300, 400],
  122 + [500, 600, 700, 800, 900]]))
  123 +
  124 +assert_allclose(b, np.array([[ 0, 1, 2, 3, 4],
  125 + [ 5, 6, 7, 8, 9]]))
  126 +{slide}
  127 +```
  128 +- Opérations éléments par élément
  129 +```python
  130 +c = a+b
  131 +assert_allclose(c, np.array([[ 0, 101, 202, 303, 404],
  132 + [505, 606, 707, 808, 909]]))
  133 +d = a*b
  134 +assert_allclose(d, np.array([[ 0, 100, 400, 900,1600],
  135 + [2500,3600,4900,6400,8100]]))
  136 +{slide}
  137 +```
  138 +```python
  139 +print(a/b)
  140 +# [[ nan 100. 100. 100. 100.]
  141 +# [ 100. 100. 100. 100. 100.]]
  142 +# nan : « not a number » (valeur spéciale, « pas un nombre »)
  143 +{slide}
  144 +```
  145 +
  146 +## Opérations entre un tableau et un nombre {libyli}
  147 +- Créons un tableaux
  148 +```python
  149 +a = np.arange(0, 1000, 100).reshape((2, 5))
  150 +assert_allclose(a, np.array([[ 0, 100, 200, 300, 400],
  151 + [500, 600, 700, 800, 900]]))
  152 +
  153 +{slide dense}
  154 +```
  155 +- Opérations avec un nombre
  156 +```python
  157 +print(a+1) # ou 1+a
  158 +# [[ 1 101 201 301 401]
  159 +# [501 601 701 801 901]]
  160 +
  161 +print(a/100) # ou a*0.01 ou 0.01*a
  162 +# [[ 0. 1. 2. 3. 4.]
  163 +# [ 5. 6. 7. 8. 9.]]
  164 +
  165 +print(a**2)
  166 +# [[ 0 10000 40000 90000 160000]
  167 +# [250000 360000 490000 640000 810000]]
  168 +
  169 +print(100/a)
  170 +# [[ inf 1. 0.5 0.3333 0.25 ]
  171 +# [ 0.2 0.1667 0.14285714 0.125 0.1111]]
  172 +#
  173 +# inf : « infinity » (infini)
  174 +{slide}
  175 +```
  176 +
  177 +
  178 +# BROADCASTING ? {no-print}
  179 +
  180 +## Broadcasting : tableau avec nombre {libyli}
  181 +- *Broadcasting* = radiodiffusion = large diffusion = ...
  182 +```python
  183 +a = np.arange(0, 1000, 100).reshape((2, 5))
  184 +print(a + 10)
  185 +print(10 / a)
  186 +{slide}
  187 +```
  188 +- Opération entre un tableau et nombre
  189 +- … le nombre est « diffusé » vers tous les éléments du tableau
  190 +- … vu autrement,
  191 + - un tableau virtuel est créé en répétant le nombre autant que nécessaire
  192 +
  193 +@svg: media/numpy/broadcast-value.svg 800 200
  194 +
  195 +@anim: svg | #visual | #broadcasted
  196 +
  197 +
  198 +
  199 +## Broadcasting : entre tableaux compatibles {libyli}
  200 +```python
  201 +a = np.arange(0, 1000, 100).reshape((2, 5))
  202 +b = np.array([[1, 3, 5, 8, 9]])
  203 +print(a + b)
  204 +c = np.array([[1], [9]])
  205 +print(a + c)
  206 +{slide}
  207 +```
  208 +-
  209 + - … les élements du petit tableau sont « diffusés » vers ceux du grand
  210 + - … un tableau virtuel est créé en répétant le petit tableau
  211 +
  212 +@svg: media/numpy/broadcast-row.svg 800 200
  213 +
  214 +@anim: svg | #visual | #broadcasted
  215 +
  216 +## Broadcasting : entre tableaux compatibles {libyli}
  217 +
  218 +@svg: media/numpy/broadcast-row.svg 800 250
  219 +
  220 +@svg: media/numpy/broadcast-col.svg 800 250
  221 +
  222 +@anim: svg | #visual | #broadcasted
  223 +
  224 +
  225 +## Exemple de broadcasting {libyli}
  226 +```python
  227 +a = np.random.uniform(100, 150, (15, 200))
  228 +# 15×200 nombres au hasard tirés entre 100 et 150
  229 +{co1 slide}
  230 +```
  231 +- Tableau ⇼ nombre
  232 +```python
  233 +b = a - np.mean(a) # que vaut b ?
  234 +# les valeurs de a moins la moyenne de ces valeurs
  235 +{co2 slide}
  236 +```
  237 +*@anim: .co2>span:nth-of-type(2)*
  238 +- Tableau ⇼ tableau
  239 +```python
  240 +c = a - np.mean(a, axis=1) # que vaut c ?
  241 +# ERREUR : (15, 200) est incompatible avec (15,)
  242 +{co3 slide}
  243 +```
  244 +*@anim: .co3>span:nth-of-type(2)*
  245 +- Tableau ⇼ tableau
  246 +```python
  247 +d = a - np.mean(a, axis=1, keepdims=True) # que vaut d ?
  248 +# les valeurs de a moins la moyenne la ligne correspondante
  249 +{co4 slide}
  250 +```
  251 +*@anim: .co4>span:nth-of-type(2)*
  252 +- Tableau ⇼ tableau
  253 +```python
  254 +e = a - np.mean(a, axis=0, keepdims=True) # que vaut e ?
  255 +# les valeurs de a moins la moyenne la colonne correspondante
  256 +{co5 slide}
  257 +```
  258 +*@anim: .co5>span:nth-of-type(2)*
  259 +
  260 +## Broadcasting Multiple {libyli}
  261 +- Broadcasting sur les deux tableaux
  262 +
  263 +@svg: media/numpy/broadcast-rowcol.svg 800 250
  264 +
  265 +@anim: svg | #visual | #broadcasted, #broadcasted2
  266 +
  267 +- NB: Marche aussi avec plus de 2 dimensions
  268 +
  269 +## Tableaux compatibles ? {libyli}
  270 +- Condition requise pour que `a + b` marche
  271 + - pour chaque axe i (NB symmétrie: on peut inverser a et b)
  272 + - soit on a le même nombre d'éléments (`a.shape[i] == b.shape[i]`)
  273 + - soit l'un des deux est `1` (`a.shape[i] == 1 or b.shape[i] == 1`)
  274 +- Exemple
  275 +```python
  276 +a = np.random.uniform(0, 1, (10, 42, 1, 1, 12, 98))
  277 +b = np.random.uniform(0, 1, (10, 1, 21, 1, 1, 1))
  278 +c = np.random.uniform(0, 1, (10, 1, 21, 1, 4, 1))
  279 +d = a + b # Ok
  280 +e = a + c # pas Ok (4 contre 12 ━━━━━━━━━━━━━┛)
  281 +f = c + b # Ok
  282 +{co slide}
  283 +```
  284 +*@anim: .co>span:nth-of-type(4)*
  285 +*@anim: .co>span:nth-of-type(5)*
  286 +*@anim: .co>span:nth-of-type(6)*
  287 +- Cas de tableaux de dimension différentes
  288 + - si un tableau est « plus petit » (moins de dimensions),
  289 + - numpy accèpte de lui ajouter des axes au début, avec `1` élément
  290 +```python
  291 +a = np.random.uniform(0, 1, ( 12, 98))
  292 +b = np.random.uniform(0, 1, ( 21, 1, 1, 1))
  293 +c = np.random.uniform(0, 1, (10, 1, 21, 1, 4, 1))
  294 +d = a + b # Ok, a mis en ( 1, 1, 12, 98)
  295 +e = a + c # Pb 4/12 avec a ( 1, 1, 1, 1, 12, 98)
  296 +f = c + b # Ok, b mis en ( 1, 1, 21, 1, 1, 1)
  297 +{co2 slide}
  298 +```
  299 +*@anim: .co2>span:nth-of-type(4)*
  300 +*@anim: .co2>span:nth-of-type(5)*
  301 +*@anim: .co2>span:nth-of-type(6)*
  302 +
  303 +
  304 +<!-- ######################################## -->
  305 +# @copy:#plan: %+class:inred: .rematplotlibprinciples
  306 +<!-- 2D -->
  307 +# @chunk: chunks/doc-plt-imshow.md
  308 +# @chunk: chunks/doc-plt-contour.md
  309 +# @chunk: chunks/doc-plt-contourf.md
  310 +
  311 +
  312 +<!-- ######################################## -->
  313 +# @copy:#plan: %+class:inred: .others
  314 +
  315 +# Accès avec tableau de booléen ok ?
  316 +# ...
  317 +
  318 +# Retour sur les pas : fonction, boucle
  319 +# ...
  320 +
  321 +# Auto-reshape
  322 +
  323 +## Pseudo-Indices `None`
  324 +- Étendre un tableau en ajoutant des axes
  325 +- Comme reshape avec
  326 + - un `1` en plus pour chaque `None`
  327 +- Exemple simple
  328 +```python
  329 +a = np.random.uniform(-1, 1, (51, 42))
  330 +# ajouter un axe (avec 1 élément) à la fin des axes de a
  331 +b = a.reshape((51, 42, 1))
  332 +c = a[:,:,None]
  333 +# ^ b et c sont identiques
  334 +```
  335 +- Exemple plus complexe
  336 +```python
  337 +a = np.random.uniform(-1, 1, (49, 51, 42))
  338 +b = a.reshape((1, 49, 1, 1, 51, 1, 42, 1, 1))
  339 +c = a[None, :, None, None, :, None, :, None, None]
  340 +# ^ b et c sont identiques
  341 +```
  342 +
  343 +# Regression linéaire
  344 +# ...
  345 +
  346 +
  347 +# Numpy 2D : evolution de cases ? {no-print}
  348 +
  349 +
  350 +
  351 +# OK {no-print}
  352 +<!--
  353 +## Points Clés {key deck-status-fake-end}
  354 +-->
  355 +
  356 +</section>
  357 +
  358 + <!-- deck.status snippet -->
  359 + <p class="deck-status deck-progress-10"> <span class="deck-status-current"></span> / <span class="deck-status-total"></span> − <span class="var-author">will be replaced by the author</span> − <span class="var-title">will be replaced by the title</span></p>
  360 +
  361 + <a data-progress-size=": spe.top(15, 555); height: 45*designRatio; left: slide.right - 90*designRatio; width: 90*designRatio" class="ccby" href="http://en.wikipedia.org/wiki/Creative_Commons_license" title="This work is under CC-BY licence." target="_blank"></a>
  362 +
  363 + <a class="ujm" data-progress-size=": spe.top(15, 525); height: 65*designRatio; left: slide.left; width: 130*designRatio" target="_blank"></a>
  364 +
  365 +</div>
  366 +<!-- clicky -->
  367 +<script type="text/javascript">
  368 +var clicky_site_ids = clicky_site_ids || [];
  369 +clicky_site_ids.push(100779706);
  370 +(function() {
  371 + var s = document.createElement('script');
  372 + s.type = 'text/javascript';
  373 + s.async = true;
  374 + s.src = '//static.getclicky.com/js';
  375 + ( document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0] ).appendChild( s );
  376 +})();
  377 +</script>
  378 +<noscript><p><img alt="Clicky" width="1" height="1" src="//in.getclicky.com/100779706ns.gif" /></p></noscript>
  379 +
  380 +
  381 +<!-- Histats.com START (aync)-->
  382 +<script type="text/javascript">var _Hasync= _Hasync|| [];
  383 +_Hasync.push(['Histats.start', '1,2767123,4,0,0,0,00010000']);
  384 +_Hasync.push(['Histats.fasi', '1']);
  385 +_Hasync.push(['Histats.track_hits', '']);
  386 +(function() {
  387 +var hs = document.createElement('script'); hs.type = 'text/javascript'; hs.async = true;
  388 +hs.src = ('//s10.histats.com/js15_as.js');
  389 +(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(hs);
  390 +})();</script>
  391 +<noscript><a href="//www.histats.com" target="_blank"><img src="//sstatic1.histats.com/0.gif?2767123&101" alt="javascript hit counter" border="0"></a></noscript>
  392 +<!-- Histats.com END -->
  393 +</body>
  394 +</html>
... ... @@ -50,6 +50,7 @@
50 50 <div data-lesson="05" data-hascode="10-04">Numpy, indices, tranches</div>
51 51 <div data-lesson="06" data-hascode="10-11">Numpy, tranches, axes</div>
52 52 <div data-lesson="07" data-hascode="10-18">Broadcasting, Matplotlib</div>
  53 + <div data-lesson="08" data-hascode="10-25">Rappels, etc</div>
53 54 <!--
54 55 <div data-lesson="08" data-hascode="y">???Matplotlib</div>
55 56 -->
raw/cours-10-25.zip View file @ 95cbcfd

No preview for this file type