Skip to content

NumPy: Ruota l’array (np.rot90)

Python

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.

lena

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

immagine numpy rot90

numpy rot90 180 immagine

numpy rot90 270 immagine

Puoi anche ruotare le immagini con le funzioni OpenCV.