Skip to content

NumPy: Disporre ndarray in piastrelle con np.tile()

Python

Con la funzione NumPy np.np.(), puoi generare un nuovo ndarray in cui ndarray originale viene richiesto come riquadri.

In questo articolo vengono descritti i seguenti contenuti.

  • Utilizzo di base di np.tile()
  • Per array bidimensionali (multidimensionali).
  • Elaborazione immagine: dispone l’immagine in riquadri

Utilizzo di base di np.tile()

Prendi un array unidimensionale come esempio.

import numpy as np

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

Passa il ndarray originale nel primo argomento A e il numero da ripetere nelle ripetizioni del secondo argomento. Viene restituito un nuovo array e l’array originale rimane invariato.

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

print(a)
# [0 1 2]

Passando una tupla al secondo argomento reps, l’array originale viene utilizzato per ogni asse.

Ad esempio, se rep è (2, 3), l’array originale verrà inviato 2 volte per asse=0 e 3 volte per asse=1 e il risultato sarà un array bidimensionale.

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)

Se il numero di elementi della tupla è 3, viene restituita una matrice tridimensionale.

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)

Per array bidimensionali (multidimensionali).

Prendi un array bidimensionale come esempio.

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

Se si specifica il secondo argomento reps come numero intero o con una tupla con meno elementi rispetto al numero di dimensioni della matrice originale (2 per una matrice bidimensionale), la matrice originale viene ripetuta lungo l’asse dell’ultima dimensione.

Ad esempio, se reps=2 o reps=(2,) (= una tupla con un elemento), il risultato sarà il seguente:

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]]

Questo equivale a ripetizioni=(1, 2) e viene ripetuto 2 volte per asse=1.

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

Se vuoi ripetere solo per asse=0, imposta reps=(2, 1).

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

È possibile aggiungere più dimensioni rispetto all’array originale.

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)

Per l’elaborazione dell’immagine (disponi l’immagine in riquadri)

Usando np.tile(), le immagini lette come l’array NumPy numpy possono essere disposte.

Vedere l’articolo seguente per le nozioni di base sull’elaborazione delle immagini tramite NumPy, ad esempio il caricamento e il salvataggio delle immagini.

Questo codice di esempio di seguito utilizza Pillow per caricare l’immagine, ma puoi utilizzare altre come OpenCV.

Nel caso di un’immagine a colori, la forma del ndarray letto è (altezza, larghezza, numero di colori).

Per ripetere questo ndarray con np.tile(), impostare il secondo argomento reps su (numero di verticale, numero di ripetizione orizzontale, 1).

Nota che se non c’è 1 finale, cioè (numero di ripetitivo verticale, numero di ripetitivo orizzontale), verrà considerato come (1, numero di ripetitivo verticale, numero di ripetitivo orizzontale) e non funzionerà.

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')

Immagine originale. Nel codice di esempio sopra, viene ridimensionato quando viene caricato.

piazza lena

Disposto in piastrelle:

immagine np.tile

Con np.tile(), puoi organizzare solo la stessa immagine. Se desideri disporre immagini diverse in riquadri, consulta i seguenti articoli.

Un altro caso d’uso per np.tile() nell’elaborazione delle immagini è la generazione di immagini di gradazione.