Associer (Mapping) des valeurs sur base d’un dictionnaire de correspondance
Avec un objet WolfArray, il est possible d’associer des valeurs à partir d’un dictionnaire. C’est l’objet de la routine map_values
[ ]:
# import _add_path # for debugging purposes only - must be removed in production
import numpy as np
from pathlib import Path
import matplotlib.pyplot as plt
from wolfhece import is_enough
if not is_enough('2.2.43'):
raise ImportError("This code requires wolfhece version 2.2.43 or higher. -- try pip install wolfhece --upgrade")
from wolfhece.wolf_array import WolfArray, header_wolf as hw, WOLF_ARRAY_FULL_SINGLE, WOLF_ARRAY_FULL_INTEGER
from wolfhece.pydownloader import toys_dataset
Création d’une matrice
Pour l’exemple, on crée une matrice de 10x10 avec des valeurs continues entre 1 et 3.
[2]:
h = hw()
h.set_origin(10., 20.)
h.set_resolution(0.5, 0.5)
h.shape = (10, 10)
a = WolfArray(srcheader=h)
print(a)
a.array[:3,:] = 1.
a.array[3:7,:] = 2.
a.array[7:,:] = 3.
a.plot_matplotlib()
print(a.array.max())
print(a.array.min())
Shape : 10 x 10
Resolution : 0.5 x 0.5
Spatial extent :
- Origin : (10.0 ; 20.0)
- End : (15.0 ; 25.0)
- Width x Height : 5.0 x 5.0
- Translation : (0.0 ; 0.0)
Null value : 0.0
3.0
1.0

Récupération d’un set des valeurs uniques
On peut récupérer un set des valeurs uniques de la matrice avec la méthode get_unique_values()
.
Ces valeurs doivent être les clés du dictionnaire de correspondance.
[3]:
print(a.get_unique_values())
[1.0 2.0 3.0]
Association des valeurs
On crée un dictionnaire de correspondance entre les valeurs initiales et les valeurs à associer. Dans l’exemple, on associe la valeur 1 à 10, la valeur 2 à 20 et la valeur 3 à 30.
[4]:
dct = {1.: 10., 2.: 20., 3.: 30.}
a.map_values(dct)
a.plot_matplotlib()
print(a.array.max())
print(a.array.min())
30.0
10.0

Valeur par défaut
Si on ne fournit pas un dictionnaire complet, il est possible d’utiliser une valeur par défaut.
[5]:
print(a.get_unique_values())
dct = {10.: 1., 30.: 3.}
a.map_values(keys_vals = dct,
default = .5)
a.plot_matplotlib()
print(a.array.max())
print(a.array.min())
WARNING:root:Value 20.0 not in keys_vals -- Will be set to default or NullValue
[10.0 20.0 30.0]
3.0
0.5

Utilisation avec une matrice d’entiers
Si la matrice ne contient pas des valeurs Float32 mais, par exemple, des entiers Int16, la méthode fonctionne aussi. Il suffit d’adapter le dictionnaire de correspondance.
[ ]:
b = WolfArray(srcheader=h, whichtype= WOLF_ARRAY_FULL_INTEGER)
b.array[:3,:] = 1
b.array[3:7,:] = 2
b.array[7:,:] = 3
print(b.get_unique_values())
dct = {1: 10, 2: 20, 3: 30.5} # note: values can be float but will be cast to int
b.map_values(dct)
b.plot_matplotlib()
print(b.array.max())
print(b.array.min())
[1 2 3]
30
10

Application
Cette routine est très utile pour associer un indice de classification (1, 2, 3, …) à une valeur physique (Manning, coefficient de ruissellement…).
Par exemple, il est possible d’obtenir une spatialisation d’occupation du sol et/ou d’utilisation avec la donnée WALOUS et ensuite d’associer des valeurs de coefficient de frottement à chaque type d’occupation du sol.
On pourrait également zoner une matrice manuellement sur base de quelques polygones et ensuite associer des valeurs de coefficient de ruissellement à chaque zone.
Dans les scripts de préparation d’une modélisation GPU sur base de scénarii, comme le script reçoit un objet WolfArray, il est possible de conserver le zonage comme information de frottement et de convertir cette information en coefficient de frottement lors de la mise en place des simulations. Ceci peut être utile notamment en phase de calage du coefficient de frottement où il suffit de changer les valeurs dans un simple dictionnaire plutôt que d’éditer toute la matrice à chaque itération.