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'
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>
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>
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>
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>
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 lignecmap = ...
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>
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()
ouisel()
? Quelle est la coordonnéex
et quelle est la coordonnéey
?
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>
[28]:
# Plot using .plot()
guinea_bissau.blue.sel(x=slice(389520, 395490), y=slice(1335000, 1329030)).plot()
[28]:
<matplotlib.collections.QuadMesh at 0x7f08cb824898>
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>
[30]:
guinea_bissau.blue.sel(x=slice(389520, 395490), y=slice(1335000, 1329030)).plot(cmap='Blues')
[30]:
<matplotlib.collections.QuadMesh at 0x7f08cb6d1710>