Skip to content

NumPy : Rotation d’un tableau (np.rot90)

En utilisant numpy.rot90(), vous pouvez faire pivoter le tableau NumPy ndarray de 90/180/270 degrés.

Cet article décrit le contenu suivant.

  • Utilisation de base de numpy.rot90()
    • Comportement par défaut
    • Spécifiez le nombre de rotations :k
  • Pour un tableau unidimensionnel
  • Pour un tableau multidimensionnel
    • Comportement par défaut
    • Spécifiez le plan à faire pivoter :axes
  • Faire pivoter l’image

Si vous souhaitez transposer au lieu de faire pivoter, consultez l’article suivant.

Utilisation de base de numpy.rot90()

Comportement par défaut

Spécifiez ndarray à faire pivoter comme premier argument de numpy.rot90(). Le tableau tourne de 90 degrés dans le sens inverse des aiguilles d’une montre.

import numpy as np

a_2d = np.arange(6).reshape(2, 3)
print(a_2d)
# [[0 1 2]
#  [3 4 5]]

a_2d_rot = np.rot90(a_2d)
print(a_2d_rot)
# [[2 5]
#  [1 4]
#  [0 3]]

numpy.rot90() renvoie une vue. Étant donné qu’une vue partage de la mémoire avec le tableau d’origine, la modification d’une valeur modifie l’autre.

print(np.shares_memory(a_2d, a_2d_rot))
# True

a_2d_rot[0, 0] = 100
print(a_2d_rot)
# [[100   5]
#  [  1   4]
#  [  0   3]]

print(a_2d)
# [[  0   1 100]
#  [  3   4   5]]

a_2d[0, 2] = 2
print(a_2d)
# [[0 1 2]
#  [3 4 5]]

print(a_2d_rot)
# [[2 5]
#  [1 4]
#  [0 3]]

Si vous souhaitez traiter des données séparées, utilisez copy().

a_2d_rot_copy = np.rot90(a_2d).copy()
print(a_2d_rot_copy)
# [[2 5]
#  [1 4]
#  [0 3]]

print(np.shares_memory(a_2d, a_2d_rot_copy))
# False

Spécifiez le nombre de rotations : k

Spécifier une valeur entière pour le deuxième argument k fait pivoter le tableau de 90 degrés dans le sens inverse des aiguilles d’une montre k fois.

print(np.rot90(a_2d, 2))
# [[5 4 3]
#  [2 1 0]]

print(np.rot90(a_2d, 3))
# [[3 0]
#  [4 1]
#  [5 2]]

print(np.rot90(a_2d, 4))
# [[0 1 2]
#  [3 4 5]]

print(np.rot90(a_2d, 100))
# [[0 1 2]
#  [3 4 5]]

Dans le cas d’une valeur négative, le sens de rotation est le sens horaire.

print(np.rot90(a_2d, -1))
# [[3 0]
#  [4 1]
#  [5 2]]

print(np.rot90(a_2d, -2))
# [[5 4 3]
#  [2 1 0]]

Pour un tableau unidimensionnel

Les tableaux unidimensionnels ne peuvent pas être pivotés.

a_1d = np.arange(3)
print(a_1d)
# [0 1 2]

# print(np.rot90(a_1d))
# ValueError: Axes must be different.

Il peut être pivoté s’il est défini comme un tableau à deux dimensions d’une seule ligne.

a_2d_row = np.arange(3).reshape(1, 3)
print(a_2d_row)
# [[0 1 2]]

print(np.rot90(a_2d_row))
# [[2]
#  [1]
#  [0]]

Pour un tableau multidimensionnel

Les tableaux multidimensionnels de trois dimensions ou plus peuvent également être pivotés.

Comportement par défaut

Par défaut, il est tourné comme suit.

a_3d = np.arange(24).reshape(2, 3, 4)
print(a_3d)
# [[[ 0  1  2  3]
#   [ 4  5  6  7]
#   [ 8  9 10 11]]
# 
#  [[12 13 14 15]
#   [16 17 18 19]
#   [20 21 22 23]]]

print(a_3d.shape)
# (2, 3, 4)

print(np.rot90(a_3d))
# [[[ 8  9 10 11]
#   [20 21 22 23]]
# 
#  [[ 4  5  6  7]
#   [16 17 18 19]]
# 
#  [[ 0  1  2  3]
#   [12 13 14 15]]]

print(np.rot90(a_3d).shape)
# (3, 2, 4)

Il est tourné dans un plan composé des deux premiers axes (dimensions).

print(a_3d[:, :, 0])
# [[ 0  4  8]
#  [12 16 20]]

print(np.rot90(a_3d)[:, :, 0])
# [[ 8 20]
#  [ 4 16]
#  [ 0 12]]

Spécifiez le plan à faire pivoter : axes

Pour les tableaux multidimensionnels, le troisième argument axes peut spécifier un plan à faire pivoter. Dans axes, spécifiez deux axes qui composent un plan avec un tuple ou une liste avec deux éléments.

La valeur par défaut est axes=(0, 1), qui tourne dans le plan des deux premiers axes. On peut confirmer que le résultat est le même que dans l’exemple ci-dessus.

print(np.rot90(a_3d, axes=(0, 1)))
# [[[ 8  9 10 11]
#   [20 21 22 23]]
# 
#  [[ 4  5  6  7]
#   [16 17 18 19]]
# 
#  [[ 0  1  2  3]
#   [12 13 14 15]]]

Un exemple de rotation dans un autre plan est le suivant. Si l’ordre des axes spécifié dans axes est inversé, le sens de rotation est inversé.

print(np.rot90(a_3d, axes=(1, 2)))
# [[[ 3  7 11]
#   [ 2  6 10]
#   [ 1  5  9]
#   [ 0  4  8]]
# 
#  [[15 19 23]
#   [14 18 22]
#   [13 17 21]
#   [12 16 20]]]

print(np.rot90(a_3d, axes=(1, 2)).shape)
# (2, 4, 3)

print(np.rot90(a_3d, axes=(2, 1)))
# [[[ 8  4  0]
#   [ 9  5  1]
#   [10  6  2]
#   [11  7  3]]
# 
#  [[20 16 12]
#   [21 17 13]
#   [22 18 14]
#   [23 19 15]]]

print(np.rot90(a_3d, axes=(2, 1)).shape)
# (2, 4, 3)

Il peut également être spécifié avec le deuxième argument k.

print(np.rot90(a_3d, 2, axes=(1, 2)))
# [[[11 10  9  8]
#   [ 7  6  5  4]
#   [ 3  2  1  0]]
# 
#  [[23 22 21 20]
#   [19 18 17 16]
#   [15 14 13 12]]]

print(np.rot90(a_3d, -1, axes=(1, 2)))
# [[[ 8  4  0]
#   [ 9  5  1]
#   [10  6  2]
#   [11  7  3]]
# 
#  [[20 16 12]
#   [21 17 13]
#   [22 18 14]
#   [23 19 15]]]

Faire pivoter l’image

Les fichiers image peuvent être lus en tant que tableau NumPy ndarray à l’aide de bibliothèques telles que Pillow (PIL) et OpenCV.

Les images peuvent être tournées à l’aide de numpy.rot90(). L’exemple suivant utilise une image couleur (tableau tridimensionnel), mais une image grise (tableau bidimensionnel) n’a pas non plus besoin de spécifier d’arguments.

L’image suivante est utilisée comme exemple.

avec

Exemple de code et résultats ci-dessous.

import numpy as np
from PIL import Image

img = np.array(Image.open('data/src/lena.jpg'))
print(type(img))
# 

print(img.shape)
# (225, 400, 3)

Image.fromarray(np.rot90(img)).save('data/dst/lena_np_rot90.jpg')

Image.fromarray(np.rot90(img, 2)).save('data/dst/lena_np_rot90_180.jpg')

Image.fromarray(np.rot90(img, 3)).save('data/dst/lena_np_rot90_270.jpg')

image numpy rot90

image numpy rot90 180

image numpy rot90 270

Vous pouvez également faire pivoter des images avec les fonctions OpenCV.