Numpy -- Episode 4
Manipulation de Forme
vous avez déjà vu, lors de la création d'un tableau bidimensionnel, comment il est possible de convertir un tableau unidimensionnel en matrice, grâce à la fonction reshape (). Par exemple, créons un tableau unidimensionnel de valeurs aléatoire en utilisant la fonction random qui se trouve dans la classe random de NumPy. Ensuite on transforme ce tableau à 1 dimension en une matrice à 2 dimensions avec 3 lignes et 4 colonnes :
>>> a = np.random.random(12)
>>> a
array([0.84592499, 0.3853343 , 0.93390949, 0.28788105, 0.0434929 ,
0.47286765, 0.95541924, 0.70313598, 0.58589687, 0.28787096,
0.26347039, 0.0206612 ])
>>> A = a.reshape(3, 4)
>>> A
array([[0.84592499, 0.3853343 , 0.93390949, 0.28788105],
[0.0434929 , 0.47286765, 0.95541924, 0.70313598],
[0.58589687, 0.28787096, 0.26347039, 0.0206612 ]])
La fonction reshape() renvoie un nouveau tableau et peut donc créer de nouveaux objets.
Cependant, si vous souhaitez modifier l'objet en modifiant la forme, vous devez affecter un tuple contenant les nouvelles dimensions directement à l’attribut shape. Exemple :
>>> a.shape = (3, 4)
>>> a
array([[0.84592499, 0.3853343 , 0.93390949, 0.28788105],
[0.0434929 , 0.47286765, 0.95541924, 0.70313598],
[0.58589687, 0.28787096, 0.26347039, 0.0206612 ]])
Comme vous le voyez dans cet exemple la forme du tableau a à changer directement sans création d’un nouveau tableau. L’opération inverse est aussi possible, on peut convertir une matrice à deux dimensions en un tableau à une dimension en utilisant la fonction ravel().
>>> a = a.ravel()
>>> a
array([0.84592499, 0.3853343 , 0.93390949, 0.28788105, 0.0434929 ,
0.47286765, 0.95541924, 0.70313598, 0.58589687, 0.28787096,
0.26347039, 0.0206612 ])
Une autre opération importante est la transposée de la matrice, qui inverse les colonnes avec les lignes : c’est la fonction transpose(),
>>> A.transpose()
array([[0.84592499, 0.0434929 , 0.58589687],
[0.3853343 , 0.47286765, 0.28787096],
[0.93390949, 0.95541924, 0.26347039],
[0.28788105, 0.70313598, 0.0206612 ]])
Joindre des tableaux
On peut fusionner plusieurs tableaux pour en former un nouveau contenant tous les tableaux. NumPy utilise le concept d'empilement. Par exemple, on peut effectuer un empilement vertical avec la fonction vstack(), qui combine le deuxième tableau en tant que nouvelles lignes du premier tableau. Dans ce cas, le tableau se développe dans une direction verticale.
En revanche, la fonction hstack() effectue un empilement horizontal; c'est-à-dire que le deuxième tableau est ajouté aux colonnes du premier tableau
>>> A = np.ones((3, 3))
>>> B = np.zeros((3, 3))
>>> np.vstack((A, B))
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
>>> np.hstack((A, B))
array([[1., 1., 1., 0., 0., 0.],
[1., 1., 1., 0., 0., 0.],
[1., 1., 1., 0., 0., 0.]])
Division d’un tableau
A l’inverse de l’assemblage des tableaux par la méthode de l’empilement, il est possible de diviser un tableau soit verticalement par la fonction vsplit() ou horizontalement avec la fonction hsplit() :
>>> A = np.arange(16).reshape((4, 4))
>>> A
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
Ainsi, si on veut diviser le tableau horizontalement, ce qui signifie que la largeur du tableau est divisée en deux parties, la matrice A de tailles 4x4 sera divisée en deux matrices de taille 2x4.
>>> [B, C] = np.hsplit(A, 2)
>>> B
array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]])
>>> C
array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])
Au lieu de cela, si nous voulons diviser le tableau verticalement, ce qui signifie que la hauteur du tableau est divisée en deux parties, la matrice A de tailles 4x4 sera divisée en deux matrices de taille 4x2.
>>> [B, C] = np.vsplit(A, 2)
>>> B
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
>>> C
array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])