Skip to content

NumPy : Disposer les ndarray en tuiles avec np.tile()

Par la fonction NumPy np.tile(), vous pouvez générer un nouveau ndarray dans lequel le ndarray d’origine est arrangé de manière répétée comme des tuiles.

Cet article décrit le contenu suivant.

  • Utilisation de base de np.tile()
  • Pour un tableau bidimensionnel (multidimensionnel)
  • Traitement d’image : Disposez l’image en tuiles

Utilisation de base de np.tile()

Prenons un tableau unidimensionnel comme exemple.

import numpy as np

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

Passez le ndarray d’origine dans le premier argument A et le nombre à répéter dans le deuxième argument reps. Un nouveau tableau est renvoyé et le tableau d’origine lui-même reste inchangé.

a_tile = np.tile(a, 3)
print(a_tile)
# [0 1 2 0 1 2 0 1 2]

print(a)
# [0 1 2]

En passant un tuple au deuxième argument reps, le tableau d’origine est répété pour chaque axe.

Par exemple, si reps est (2, 3), le tableau d’origine sera répété 2 fois pour l’axe = 0 et 3 fois pour l’axe = 1, et le résultat sera un tableau à deux dimensions.

print(np.tile(a, (2, 3)))
# [[0 1 2 0 1 2 0 1 2]
#  [0 1 2 0 1 2 0 1 2]]

print(np.tile(a, (2, 3)).shape)
# (2, 9)

Si le nombre d’éléments de tuple est 3, un tableau tridimensionnel est renvoyé.

print(np.tile(a, (2, 3, 4)))
# [[[0 1 2 0 1 2 0 1 2 0 1 2]
#   [0 1 2 0 1 2 0 1 2 0 1 2]
#   [0 1 2 0 1 2 0 1 2 0 1 2]]
# 
#  [[0 1 2 0 1 2 0 1 2 0 1 2]
#   [0 1 2 0 1 2 0 1 2 0 1 2]
#   [0 1 2 0 1 2 0 1 2 0 1 2]]]

print(np.tile(a, (2, 3, 4)).shape)
# (2, 3, 12)

Pour un tableau bidimensionnel (multidimensionnel)

Prenons un tableau à deux dimensions comme exemple.

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

Si vous spécifiez le deuxième argument reps sous la forme d’un entier ou avec un tuple avec moins d’éléments que le nombre de dimensions du tableau d’origine (2 pour un tableau à deux dimensions), le tableau d’origine est répété le long de l’axe de la dernière dimension.

Par exemple, si reps=2 ou reps=(2,) (= un tuple avec un élément), le résultat sera le suivant :

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

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

Cela équivaut à reps=(1, 2) et est répété 2 fois pour axis=1.

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

Si vous souhaitez répéter uniquement pour axis=0, définissez reps=(2, 1).

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

Il est possible d’ajouter plus de dimensions que le tableau d’origine.

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

print(np.tile(a_2d, (2, 2, 2)).shape)
# (2, 4, 6)

Pour le traitement d’image (disposer l’image en tuiles)

En utilisant np.tile(), les images lues comme le tableau NumPy numpy.ndarray peuvent être organisées de manière répétée en tuiles.

Consultez l’article suivant pour les bases du traitement d’image à l’aide de NumPy, telles que le chargement et l’enregistrement d’images.

Cet exemple de code ci-dessous utilise Pillow pour charger l’image, mais vous pouvez utiliser d’autres bibliothèques telles que OpenCV.

Dans le cas d’une image couleur, la forme du ndarray lu est (hauteur, largeur, nombre de couleurs).

Pour répéter ce ndarray avec np.tile(), définissez le deuxième argument reps sur (numéro de répétition verticale, numéro de répétition horizontale, 1).

Notez que s’il n’y a pas de 1 à la fin, c’est-à-dire (numéro de répétition verticale, numéro de répétition horizontale), il sera considéré comme (1, numéro de répétition verticale, numéro de répétition horizontale) et cela ne fonctionnera pas.

import numpy as np
from PIL import Image

img = np.array(Image.open('data/src/lena_square.png').resize((128, 128)))

print(img.shape)
# (128, 128, 3)

img_tile = np.tile(img, (2, 3, 1))

print(img_tile.shape)
# (256, 384, 3)

Image.fromarray(img_tile).save('data/dst/lena_numpy_tile.jpg')

Image originale. Dans l’exemple de code ci-dessus, il est redimensionné lors du chargement.

carré de léna

Disposés en tuiles :

image np.tile

Avec np.tile(), vous ne pouvez organiser que la même image. Si vous souhaitez disposer différentes images dans des mosaïques, consultez les articles suivants.

Un autre cas d’utilisation de np.tile() dans le traitement d’image est la génération d’une image de gradation.