Solutions d’exercices

Cette section contient les solutions possibles aux exercices posés dans le module Python basics. Il y a plus d’une solution correcte pour la plupart des exercices. Les réponses sont donc données à titre indicatif.

Télécharger le cahier de solutions de l’exercice

Pour visualiser les solutions sous la forme d’un carnet de notes interactif, téléchargez le fichier sur votre machine et chargez-le dans le Sandbox comme dans les leçons sur les bases de Python.

Bases de Python 1

1.1 Remplissez la ligne de l’astérisque avec votre nom et exécutez la cellule.

[1]:
# Fill the ****** space with your name and run the cell.

message = "My name is Python"

message
[1]:
'My name is Python'

1.2 Vous pouvez ajouter de nouvelles cellules pour insérer du nouveau code à n’importe quel endroit d’un cahier. Cliquez sur l’icône + dans le menu supérieur pour ajouter une nouvelle cellule sous la cellule actuelle. Ajoutez une nouvelle cellule sous la cellule suivante, et utilisez-la pour imprimer la valeur de la variable a.

[2]:
a = 365*24

# Add a new cell just below this one. Use it to print the value of variable `a`
[3]:
a
[3]:
8760

Question: Maintenant, que se passe-t-il si vous remontez dans le cahier et exécutez une autre cellule contenant print(a) ?

Réponse: Il devrait maintenant imprimer 8760 car “global state” signifie que la valeur de a a été modifiée.

Les bases de Python 2

[4]:
import numpy as np

2.1 Utilisez la fonction numpy ``add”” pour ajouter les valeurs ``34”” et ``29”” dans la cellule ci-dessous.

[5]:
# Use numpy add to add 34 and 29

np.add(34,29)
[5]:
63

2.2 Déclarer un nouveau tableau dont le contenu est [5,4,3,2,1] et le découper pour sélectionner les 3 derniers éléments.

[6]:
# Substitute the ? symbols by the correct expressions and values

# Declare the array

arr = np.array([5, 4, 3, 2, 1])

# Slice array for the last 3 items only

arr[-3:]
[6]:
array([3, 2, 1])

2.3 : Sélectionnez tous les éléments du tableau ci-dessous, à l’exception du dernier, [15].

[7]:
arr = np.array([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15])

# Substitute the ? symbols by the correct expressions and values

arr[:-1]
[7]:
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])

2.4 Utilisez arr comme défini en 2.3. Excluez le dernier élément de la liste, mais ne sélectionnez maintenant qu’un élément sur trois. Rappelez-vous que le troisième indice indique stride, s’il est utilisé.

Introduction: Le résultat devrait être [0,3,6,9,12].

[8]:
# Substitute the ? symbols by the correct expressions and values

arr[:-1:3]
[8]:
array([ 0,  3,  6,  9, 12])

2.5 Vous devrez combiner les comparaisons de tableaux et les opérateurs logiques pour résoudre cette question. Trouvez les valeurs du tableau suivant qui sont supérieures à 3 et inférieures à 7. Le résultat doit être un tableau booléen.

Introduction: Si vous êtes bloqué, relisez la section sur les tableaux booléens.

[9]:
arr = np.array([1, 3, 5, 1, 6, 3, 1, 5, 7, 1])

# Use array comparisons (<, >, etc.) and logical operators (*, +) to find where
# the values are greater than 3 and less than 7.

boolean_array = (arr > 3)*(arr < 7)
[10]:
boolean_array
[10]:
array([False, False,  True, False,  True, False, False,  True, False,
       False])

2.6 Utilisez votre tableau booléen de 2.5 pour masquer les valeurs False de arr.

Introduction: Le résultat devrait être [5, 6, 5].

[11]:
# Use your resulting boolean_array array from 2.5
# to mask arr as defined in 2.5

arr[boolean_array]
[11]:
array([5, 6, 5])

Les bases de Python 3

[12]:
%matplotlib inline

import numpy as np
from matplotlib import pyplot as plt

im = np.copy(plt.imread('Guinea_Bissau.JPG'))

3.1 Utilisons la fonctionnalité d’indexation de numpy pour sélectionner une partie de cette image. Sélectionnez le coin supérieur droit de cette image avec la forme (200,200).

Introduction: Rappelez-vous qu’il y a trois dimensions dans cette image. Les deux points séparent les portées, et les virgules les dimensions.

[13]:
# Both options below are correct

topright = im[:200, -200:, ]

topright = im[:200, 400:600, ]

# Plot your result using imshow

plt.imshow(topright)
[13]:
<matplotlib.image.AxesImage at 0x7f08e28f7940>
../_images/python_basics_06_python_solutions_27_1.png

3.2 Regardons l’un des pixels de cette image. Nous choisissons le coin supérieur gauche avec la position (0,0) et montrons les valeurs de ses canaux RVB.

[14]:
# Run this cell to see the colour channel values

im[0,0]
[14]:
array([249, 196, 104], dtype=uint8)

La première valeur correspond à la composante rouge, la deuxième à la composante verte et la troisième à la composante bleue. uint8 peut contenir des valeurs dans la plage [0-255] donc le pixel a beaucoup de rouge, un peu de vert, et peu de bleu. Ce pixel est d’une couleur sableuse jaune orangé.

Maintenant, nous allons modifier l’image.

Que se passe-t-il si nous fixons toutes les valeurs représentant le canal bleu à la valeur maximale ?

[15]:
# Run this cell to set all blue channel values to 255
# We first make a copy to avoid modifying the original image

im2 = np.copy(im)

im2[:,:,2] = 255

plt.imshow(im2)
[15]:
<matplotlib.image.AxesImage at 0x7f08e23d0ac8>
../_images/python_basics_06_python_solutions_32_1.png

La notation de l’index [ :,:,2] sélectionne les pixels de toutes les hauteurs et de toutes les largeurs, mais uniquement le troisième canal de couleur.

Pouvez-vous modifier la cellule de code ci-dessus pour fixer toutes les valeurs rouges à la valeur maximale de 255 ?

[16]:
im2 = np.copy(im)

im2[:,:,0] = 255

plt.imshow(im2)
[16]:
<matplotlib.image.AxesImage at 0x7f08e0b34ef0>
../_images/python_basics_06_python_solutions_35_1.png

Les bases de Python 4

[17]:
%matplotlib inline

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import colors

# grass = 1
area = np.ones((100,100))
# crops = 2
area[10:60,20:50] = 2
# city = 3
area[70:90,60:80] = 3
index = {1: 'green', 2: 'yellow', 3: 'grey'}
cmap = colors.ListedColormap(index.values())

4.1 La saison des récoltes est arrivée et nos terres cultivées ont changé de couleur pour devenir brunes. Pouvez-vous :

4.1.1 Modifier la zone jaune pour contenir la nouvelle valeur 4 ?

4.1.2 Ajouter une nouvelle entrée au dictionnaire ``index”” en associant le numéro ``4”” à la valeur ``brown””.

4.1.3 Tracer la zone.

[18]:
# 4.1.1 Modify the yellow area to hold the value 4
area[10:60,20:50] = 4
[19]:
# 4.1.2 Add a new key-value pair to index that maps 4 to 'brown'
index[4] = 'brown'
[20]:
# 4.1.3 Copy the cmap definition and re-run it to add the new colour
cmap = colors.ListedColormap(index.values())
# Plot the area
plt.imshow(area, cmap=cmap)
[20]:
<matplotlib.image.AxesImage at 0x7f08e0b26198>
../_images/python_basics_06_python_solutions_41_1.png

Introduction: Si vous voulez tracer la nouvelle zone, vous devez redéfinir cmap pour que la nouvelle valeur se voit attribuer une couleur dans la carte des couleurs. Copiez et collez la ligne cmap = ... du tracé original.

4.2 Définissez zone [20:40, 80:95] = np.nan. Tracez la zone maintenant.

[21]:
# Set the nan area
area[20:40, 80:95] = np.nan
[22]:
# Plot the entire area
plt.imshow(area, cmap=cmap)
[22]:
<matplotlib.image.AxesImage at 0x7f08e0a78e48>
../_images/python_basics_06_python_solutions_45_1.png

4.3 Trouvez la médiane du tableau area de 4.2 en utilisant np.nanmedian. Est-ce que cela correspond à votre interprétation visuelle ? Comment cela se compare-t-il à l’utilisation de np.median ?

[23]:
# Use np.nanmedian to find the median of the area
np.nanmedian(area)
[23]:
1.0
[24]:
np.median(area)
[24]:
nan

np.median renvoie une valeur de nan car il ne peut pas interpréter les pixels sans données. np.nanmedian exclut les valeurs NaN, il renvoie donc une valeur de 1 qui indique une herbe. Cela correspond au tracé de area.

Les bases de Python 5

[25]:
%matplotlib inline

import numpy as np
from matplotlib import pyplot as plt
import xarray as xr
guinea_bissau = xr.open_dataset('guinea_bissau.nc')

5.1 Pouvez-vous accéder à la valeur crs dans les attributs du guinea_bissau xarray.Dataset ?

Introduction: Vous pouvez faire appel aux « attributs » de la même manière que vous sélectionneriez une « variable » ou une « coordonnée ».

[26]:
# Replace the ? with the attribute name

guinea_bissau.crs
[26]:
'EPSG:32628'

5.2 Sélectionnez la région de la variable « bleue » délimitée par ces coordonnées :

  • latitude de l’intervalle [1335000, 1329030]

  • longitude de la plage [389520, 395490]

Instruction: Voulons-nous utiliser sel() ou isel() ? Quelle est la coordonnée x et quelle est la coordonnée y ?

5.3 Tracez la région sélectionnée en utilisant imshow, puis tracez la région en utilisant .plot().

[27]:
# Plot using plt.imshow
plt.imshow(guinea_bissau.blue.sel(x=slice(389520, 395490), y=slice(1335000, 1329030)))
[27]:
<matplotlib.image.AxesImage at 0x7f08cb8f0da0>
../_images/python_basics_06_python_solutions_58_1.png
[28]:
# Plot using .plot()
guinea_bissau.blue.sel(x=slice(389520, 395490), y=slice(1335000, 1329030)).plot()
[28]:
<matplotlib.collections.QuadMesh at 0x7f08cb824898>
../_images/python_basics_06_python_solutions_59_1.png

Pouvez-vous changer la carte des couleurs en 'Blues' ?

[29]:
plt.imshow(guinea_bissau.blue.sel(x=slice(389520, 395490), y=slice(1335000, 1329030)), cmap='Blues')
[29]:
<matplotlib.image.AxesImage at 0x7f08cb763eb8>
../_images/python_basics_06_python_solutions_61_1.png
[30]:
guinea_bissau.blue.sel(x=slice(389520, 395490), y=slice(1335000, 1329030)).plot(cmap='Blues')
[30]:
<matplotlib.collections.QuadMesh at 0x7f08cb6d1710>
../_images/python_basics_06_python_solutions_62_1.png