
Per scegliere la forma di un array NumPy ndarray, utilizzare il metodo reshape() di ndarray o la funzione numpy.reshape().
In questo articolo vengono descritti i seguenti contenuti.
- Come utilizzare il metodo ndarray.reshape()
- Come usare la funzione numpy.reshape()
- Ordine di conversione:
order
- Il significato di -1 in reshape()
- reshape() porta la vista
Se vuoi controllare la forma o il numero di dimensioni di ndarray, consulta il seguente articolo.
È possibile reshape() per utilizzare qualsiasi forma, ma potrebbero essere disponibili alternative per comodità in determinate conversioni di forme.
Inoltre, durante il funzionamento tra gli array NumPy (ndarray), ogni forma viene automaticamente convertita in modo che sia la stessa la trasmissione.
Come utilizzare il metodo ndarray.reshape()
Prendi il seguente array NumPy unidimensionale ndarray come esempio.
import numpy as np
a = np.arange(24)
print(a)
# [ 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.shape)
# (24,)
print(a.ndim)
# 1
Specificare la forma come elenco o tupla nel primo argomento del metodo reshape() di numpy.ndarray.
a_4_6 = a.reshape([4, 6])
print(a_4_6)
# [[ 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_4_6.shape)
# (4, 6)
print(a_4_6.ndim)
# 2
a_2_3_4 = a.reshape([2, 3, 4])
print(a_2_3_4)
# [[[ 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_2_3_4.shape)
# (2, 3, 4)
print(a_2_3_4.ndim)
# 3
Se la forma non corrisponde al numero di elementi nella matrice originale, si verifica ValueError.
# a_5_6 = a.reshape([5, 6])
# ValueError: cannot reshape array of size 24 into shape (5,6)
È possibile specificare un turno ogni valore di dimensione, non un elenco o una tupla.
print(a.reshape(4, 6))
# [[ 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.reshape(2, 3, 4))
# [[[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
#
# [[12 13 14 15]
# [16 17 18 19]
# [20 21 22 23]]]
Come usare la funzione numpy.reshape()
Nella funzione numpy.reshape(), specifica l’originale numpy.ndarray come primo argomento e la forma per il secondo argomento come elenco o tupla. Se la forma non corrisponde al numero di elementi nella matrice originale, si verifica ValueError.
print(np.reshape(a, [4, 6]))
# [[ 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(np.reshape(a, [2, 3, 4]))
# [[[ 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(np.reshape(a, [5, 6]))
# ValueError: cannot reshape array of size 24 into shape (5,6)
Il secondo argomento della funzione numpy.reshape() deve essere una lista o una tupla. Se si specifica il valore di ciascuna dimensione a turno, come il metodo reshape() di numpy.ndarray, viene generato ValueError.
print(a.reshape(4, 6))
# [[ 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(np.reshape(a, 4, 6))
# ValueError: cannot reshape array of size 24 into shape (4,)
Ordine di conversione:order
L’ordine di conversione può essere specificato con l’ordine degli argomenti. order=”C”(default) significa ordine dell’indice similitudine a C, order=”F” significa ordine dell’indice similitudine a Fortran.
I risultati sono diversi come segue.
print(a.reshape([4, 6], order='C'))
# [[ 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.reshape([4, 6], order='F'))
# [[ 0 4 8 12 16 20]
# [ 1 5 9 13 17 21]
# [ 2 6 10 14 18 22]
# [ 3 7 11 15 19 23]]
print(a.reshape([2, 3, 4], order='C'))
# [[[ 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.reshape([2, 3, 4], order='F'))
# [[[ 0 6 12 18]
# [ 2 8 14 20]
# [ 4 10 16 22]]
#
# [[ 1 7 13 19]
# [ 3 9 15 21]
# [ 5 11 17 23]]]
Lo stesso per la funzione numpy.reshape():
print(np.reshape(a, [4, 6], order='F'))
# [[ 0 4 8 12 16 20]
# [ 1 5 9 13 17 21]
# [ 2 6 10 14 18 22]
# [ 3 7 11 15 19 23]]
Il metodo reshape() di numpy.ndarray ti consente di specificare la forma di ciascuna dimensione a turno come descritto sopra, quindi se specifichi l’ordine degli argomenti, devi usare la parola chiave.
Nella funzione numpy.reshape(), il terzo argomento è sempre ordine, quindi la parola chiave può essere omessa.
# print(a.reshape([4, 6], 'F'))
# TypeError: 'list' object cannot be interpreted as an integer
print(np.reshape(a, [4, 6], 'F'))
# [[ 0 4 8 12 16 20]
# [ 1 5 9 13 17 21]
# [ 2 6 10 14 18 22]
# [ 3 7 11 15 19 23]]
Il significato di -1 in reshape()
Puoi usare -1 per specificare la forma in reshape().
Prendi il metodo reshape() di numpy.ndarray come esempio, ma lo stesso vale per la funzione numpy.reshape().
La lunghezza della dimensione impostata su -1 viene determinata automaticamente deducendo dai valori specificati di altre dimensioni. Ciò è quando utile si converte una forma di matrice di grandi dimensioni.
print(a.reshape([4, -1]))
# [[ 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.reshape([2, -1, 4]))
# [[[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
#
# [[12 13 14 15]
# [16 17 18 19]
# [20 21 22 23]]]
È possibile utilizzare -1 per una sola dimensione. Se utilizzato per più di una dimensione, si verifica ValueError.
# print(a.reshape([2, -1, -1]))
# ValueError: can only specify one unknown dimension
Inoltre, se nessun valore soddisfa la condizione, viene generato ValueError.
# print(a.reshape([2, -1, 5]))
# ValueError: cannot reshape array of size 24 into shape (2,newaxis,5)
reshape() porta la vista
Nota che entrambi i metodi reshape() della funzione numpy.ndarray e numpy.reshape() restituiscono una vista invece di una copia quando possibile. Poiché è “il più possibile”, una copia può essere restituita al posto di una vista a seconda del layout della memoria.
Vedere il seguente articolo per recensioni e copie in NumPy.
L’esempio seguente utilizza il metodo reshape() di numpy.ndarray, ma lo stesso vale per la funzione numpy.reshape().
reshape() contiene una vista e condivide la memoria l’originale numpy.ndarray.
a = np.arange(8)
print(a)
# [0 1 2 3 4 5 6 7]
a_2_4 = a.reshape([2, 4])
print(a_2_4)
# [[0 1 2 3]
# [4 5 6 7]]
print(np.shares_memory(a, a_2_4))
# True
La modifica dell’oggetto originale cambia l’oggetto di visualizzazione restituito da reshape() come segue:
a[0] = 100
print(a)
# [100 1 2 3 4 5 6 7]
print(a_2_4)
# [[100 1 2 3]
# [ 4 5 6 7]]
Lo stesso vale per il caso inverso. La modifica dell’oggetto vista restituito da reshape() cambia l’oggetto originale.
a_2_4[0, 0] = 0
print(a_2_4)
# [[0 1 2 3]
# [4 5 6 7]]
print(a)
# [0 1 2 3 4 5 6 7]
Se vuoi ottenere una copia, usa il metodo copy(). In questo caso, la modifica di ciascun oggetto non ha effetto sull’altro oggetto.
a_2_4_copy = a.reshape([2, 4]).copy()
print(a_2_4_copy)
# [[0 1 2 3]
# [4 5 6 7]]
print(np.shares_memory(a, a_2_4_copy))
# False
a[0] = 100
print(a)
# [100 1 2 3 4 5 6 7]
print(a_2_4_copy)
# [[0 1 2 3]
# [4 5 6 7]]
a_2_4_copy[0, 0] = 200
print(a_2_4_copy)
# [[200 1 2 3]
# [ 4 5 6 7]]
print(a)
# [100 1 2 3 4 5 6 7]
Quello che segue è un esempio in cui reshape() contiene una copia invece di una vista:
Se il passo in memoria non è costante a seguito della trasformazione di una fetta specificata in un passaggio, viene restituita una copia.
a = np.arange(6).reshape(2, 3)
print(a)
# [[0 1 2]
# [3 4 5]]
a_step = a[:, ::2]
print(a_step)
# [[0 2]
# [3 5]]
print(a_step.reshape(-1))
# [0 2 3 5]
print(np.shares_memory(a_step, a_step.reshape(-1)))
# False
Per una sezione specificata per il passaggio, se il passo è costante, viene restituita una vista.
a = np.arange(8).reshape(2, 4)
print(a)
# [[0 1 2 3]
# [4 5 6 7]]
a_step = a[:, ::2]
print(a_step)
# [[0 2]
# [4 6]]
print(a_step.reshape(-1))
# [0 2 4 6]
print(np.shares_memory(a_step, a_step.reshape(-1)))
# True