
Usando numpy.rot90(), puoi ruotare l’array NumPy ndarray di 90/180/270 gradi.
In questo articolo vengono descritti i seguenti contenuti.
- Utilizzo di base di numpy.rot90()
- Comportamento predefinito
- Specificare il numero di volte per ruotare:
k
- Per array unidimensionali
- Per array multidimensionali
- Comportamento predefinito
- Specifica il pianoforte da ruotare:
axes
- Ruota immagine
Se vuoi trasporre invece di ruotare, consulta il seguente articolo.
Utilizzo di base di numpy.rot90()
Comportamento predefinito
Specificare ndarray da ruotare come primo argomento di numpy.rot90(). L’array ruota di 90 gradi in senso antiorario.
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() mostra una vista. Poiché una vista condivide la memoria con l’array originale, la modifica di un valore cambia l’altro.
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]]
Se vuoi elaborare dati separati, usa 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
Specificare il numero di volte per ruotare: k
Specificando un valore intero per il secondo argomento k, la matrice ruota di 90 gradi in senso antiorario k volte.
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]]
In caso di valore negativo, il senso di rotazione è orario.
print(np.rot90(a_2d, -1))
# [[3 0]
# [4 1]
# [5 2]]
print(np.rot90(a_2d, -2))
# [[5 4 3]
# [2 1 0]]
Per array unidimensionali
Gli array unidimensionali non possono essere ruotati.
a_1d = np.arange(3)
print(a_1d)
# [0 1 2]
# print(np.rot90(a_1d))
# ValueError: Axes must be different.
Può essere ruotato se definito come un array bidimensionale di una sola riga.
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]]
Per array multidimensionali
È anche possibile ruotare gli array multidimensionali di tre o più dimensioni.
Comportamento predefinito
Per impostazione predefinita, viene ruotato come segue.
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)
Viene ruotato su un piano costituito dai primi due assi (dimensioni).
print(a_3d[:, :, 0])
# [[ 0 4 8]
# [12 16 20]]
print(np.rot90(a_3d)[:, :, 0])
# [[ 8 20]
# [ 4 16]
# [ 0 12]]
Specificare il piano da ruotare: assi
Per le matrici multidimensionali, il terzo argomento assi può specificare un piano da ruotare. In assi, specifica due assi che compongono un piano con una tupla o un elenco con due elementi.
Il valore predefinito è assi=(0, 1), che ruota sul piano dei primi due assi. Si può confermare che il risultato è lo stesso dell’esempio precedente.
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 esempio di rotazione su un altro piano è il seguente. Se l’ordine degli assi specificato in assi viene invertito, il senso di rotazione viene invertito.
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)
Può anche essere specificato insieme al secondo argomento 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]]]
Ruota immagine
I file di immagine possono essere letti come array NumPy ndarray utilizzando librerie come Pillow (PIL) e OpenCV.
Le immagini possono essere ruotate usando numpy.rot90(). L’esempio seguente usa un’immagine a colori (matrice tridimensionale), ma anche un’immagine grigia (matrice bidimensionale) non ha bisogno di specificare alcun argomento.
L’immagine seguente viene utilizzata come esempio.
Il codice di esempio ei risultati sono seguiti.
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')
Puoi anche ruotare le immagini con le funzioni OpenCV.