En este tutorial, aprenderá a utilizar NumPy remodelar() para remodelar matrices NumPy sin cambiar los datos originales.
Cuando se trabaja con matrices Numpy, es posible que a menudo desee remodelar una matriz existente en una matriz de diferentes dimensiones. Esto puede ser especialmente útil cuando se transforman los datos en varios pasos.
Y NumPy reshape()
le ayudará a hacerlo fácilmente. En los próximos minutos, aprenderá la sintaxis para utilizar reshape( )
, y también a remodelar matrices a diferentes dimensiones.
¿Qué es la remodelación en las matrices NumPy?
Cuando trabaje con matrices NumPy, es posible que primero desee crear una matriz unidimensional de números. Y luego remodelarlo a un array con la dimensión deseada.
Esto resulta especialmente útil cuando las dimensiones de la nueva matriz no se conocen inicialmente o se deducen durante la ejecución. O también puede ocurrir que un determinado paso del procesamiento de datos requiera que la entrada tenga una forma específica.
Aquí es donde la remodelación resulta útil.
Por ejemplo, considere la siguiente ilustración. Tenemos un vector, una matriz unidimensional de 6 elementos. Y podemos darle nueva forma en matrices de formas 2×3, 3×2, 6×1, etc.

▶️ Para seguir los ejemplos de este tutorial, necesita tener instalados Python y NumPy. Si aún no tiene NumPy, consulte nuestra guía de instalación de NumPy.
Ahora puede seguir adelante e importar NumPy bajo el alias np
ejecutando: import numpy as np
.
Procedamos a aprender la sintaxis en la siguiente sección.
Sintaxis de NumPy reshape()
He aquí la sintaxis para utilizar NumPy reshape():
np.reshape(arr, newshape, order = 'C'|'F'|'A')
- arr es cualquier objeto array NumPy válido. Aquí, es el array al que se le va a dar nueva forma.
- newshape es la forma del nuevo array. Puede ser un entero o una tupla.
- Cuando newshape es un entero, la matriz devuelta es unidimensional.
- pedir se refiere al orden en el que desea leer los elementos de la matriz a remodelar.
- El valor por defecto es 'C', lo que significa que los elementos de la matriz original se leerán en un orden de indexación tipo C (empezando por 0)
- ‘ F' significa indexación tipo Fortran (empezando por 1). Y ' A ' lee los elementos en un orden tipo C o tipo Fortran dependiendo de la disposición en memoria del array arr.
Entonces, ¿qué devuelve
np.reshape()
?Devuelve una vista remodelada de la matriz original si es posible. Si no, devuelva una copia de la matriz.
En la línea anterior, mencionamos que NumPy reshape
() intentaría devolver una vista siempre que fuera posible. En caso contrario, devuelva una copia. Procedamos a discutir las diferencias entre una vista y una copia.
Vista vs. Copia de matrices NumPy
Como su nombre indica, la copia es una copia del array original. Y cualquier cambio realizado en la copia no afectará al array original.
Por otro lado, vista simplemente se refiere a la vista remodelada del array original. Esto significa que cualquier cambio realizado en la vista también afectará a la matriz original y viceversa.
Utilice NumPy reshape() para remodelar matrices 1D a matrices 2D
#1. Empecemos a crear el array de muestra utilizando np.arange().
Necesitamos un array de 12 números, del 1 al 12, llamado arr1. Como la función NumPy arange() excluye por defecto el punto final, establezca el valor de parada en 13.
Utilicemos ahora la sintaxis anterior y transformemos arr1
con 12 elementos en una matriz 2D de forma (4,3). Llamémosle arr2
con 4 filas y 3 columnas.
import numpy as np
arr1 = np.arange(1,13)
print("Matriz original, antes de reformar:\n")
print(arr1)
# Reformar matriz
arr2 = np.reshape(arr1,(4,3))
print("\nMatriz reformada:")
print(arr2)
Echemos un vistazo a las matrices original y remodelada.
Matriz original, antes de la remodelación:
[ 1 2 3 4 5 6 7 8 9 10 11 12]
Matriz remodelada:
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
En lugar de pasar la matriz como argumento
np.reshape()
, también puede llamar al método.reshape()
sobre la matriz original.
Puede ejecutar dir( arr1)
, y le listará todos los métodos y atributos posibles que puede utilizar sobre el objeto array arr1
.
dir(arr1)
# Salida
[
...
...
'reshape'
...
..
]
En la celda de código anterior, puede ver que .reshape()
es un método válido para utilizar en la matriz NumPy existente arr1
.
▶️ Por lo tanto, también puede utilizar la siguiente sintaxis simplificada para remodelar matrices NumPy.
arr.reshape(d0,d1,...,dn)
# donde:
# d0, d1,..,dn son las dimensiones de la matriz reformada
# d0 * d1 * ...* dn = N, el número de elementos de arr
Para el resto de este tutorial, utilizaremos esta sintaxis en nuestros ejemplos.
#2. Intentemos transformar nuestro vector de 12 elementos en una matriz de 12 x 1.
import numpy as np
arr1 = np.arange(1,13)
print("Matriz original, antes de reformar:\n")
print(arr1)
# Reformar matriz
arr3 = arr1.reshape(12,1)
print("\nMatriz reformada:")
print(arr3)
En la salida que se muestra a continuación, puede ver que se ha dado la forma necesaria a la matriz.
Matriz original, antes de la remodelación:
[ 1 2 3 4 5 6 7 8 9 10 11 12]
Matriz remodelada:
[[ 1]
[ 2]
[ 3]
[ 4]
[ 5]
[ 6]
[ 7]
[ 8]
[ 9]
[10]
[11]
[12]]
❔ Entonces, ¿cómo comprobamos si hemos obtenido una copia o una vista?
Para comprobarlo, puede llamar al atributo base
sobre el array devuelto.
- Si el array es una copia, el atributo
base
seráNinguno
. - Si el array es una vista, el atributo
base
será el array original.
Verifiquemos esto rápidamente.
arr3.base
# Salida
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
Como puede ver, el atributo base
de arr3
devuelve el array original. Esto significa que hemos recibido una vista del array original.
#3. Ahora, intentemos remodelar el vector en otra matriz válida de 2 x 6.
import numpy as np
arr1 = np.arange(1,13)
print("Matriz original, antes de reformar:\n")
print(arr1)
# Reformar matriz
arr4 = arr1.reshape(2,6)
print("\nMatriz reformada:")
print(arr4)
Y aquí está la salida
Matriz original, antes de la remodelación:
[ 1 2 3 4 5 6 7 8 9 10 11 12]
Matriz remodelada:
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]]
En la siguiente sección, vamos a remodelar arr1
para convertirlo en un array 3D.
Utilice NumPy reshape() para remodelar un array 1D a un array 3D
Para remodelar arr1
en una matriz 3D, establezcamos las dimensiones deseadas en (1, 4, 3).
import numpy as np
arr1 = np.arange(1,13)
print("Matriz original, antes de reformar:\n")
print(arr1)
# Reformar matriz
arr3D = arr1.reshape(1,4,3)
print("\nMatriz reformada:")
print(arr3D)
Ahora hemos creado una matriz 3D con los mismos 12 elementos que la matriz original arr1
.
Matriz original, antes de la remodelación:
[ 1 2 3 4 5 6 7 8 9 10 11 12]
Matriz remodelada:
[[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]]
Cómo depurar errores de valor durante el remodelado
Si recuerda la sintaxis, el remodelado sólo es válido cuando el producto de las dimensiones es igual al número de elementos de la matriz.
import numpy as np
arr1 = np.arange(1,13)
print("Matriz original, antes de reformar:\n")
print(arr1)
# Reformar matriz
arr2D = arr1.reshape(4,4)
print("\nMatriz reformada:")
print(arr2D)
Aquí, está intentando remodelar una matriz de 12 elementos en una matriz de 4×4 con 16 elementos. El intérprete lanza un error de valor, como se ve a continuación.
Matriz original, antes de remodelar:
[ 1 2 3 4 5 6 7 8 9 10 11 12]
-----------------------------------------------------------
ValueError
Traceback (most recent call last)
<ipython-input-11-63552bcc8c37> in <module>()
6
7 # Remodelar matriz
---->
8 arr2 = arr1.reshape(4,4)
9 print("\nReformar array:")
10 print(arr2)
ValueError: cannot reshape array of size 12 into shape (4,4)
Para evitar estos errores, puede utilizar -1 para deducir automáticamente la forma de una de las dimensiones en función del número total de elementos.
Por ejemplo, si conoce de antemano n - 1 dimensiones, puede utilizar -1 para inferir la n-ésima dimensión en la matriz remodelada.
Si tiene una matriz de 24 elementos y desea remodelarla para convertirla en una matriz 3D. Suponga que necesita 3 filas y 4 columnas. Puede pasar el valor -1 a lo largo de la tercera dimensión.
import numpy as np
arr1 = np.arange(1,25)
print("Matriz original, antes de reformar:\n")
print(arr1)
# Reformar matriz
arr_res = arr1.reshape(4,3,-1)
print("\nMatriz reformada:")
print(arr_res)
print(f "Forma de arr_res:{arr_res.shape}")
Al examinar la forma de la matriz con forma, puede ver que la matriz remodelada tiene una forma de 2 a lo largo de la tercera dimensión.
Matriz original, antes de la remodelación:
[ 1 2 3 4 5 6 7 8 9 10 11 12
13 14 15 16 17 18 19 20 21 22 23 24]
Matriz remodelada:
[[[ 1 2]
[ 3 4]
[ 5 6]]
[[ 7 8]]
[ 9 10]
[11 12]]
[[13 14]
[15 16]
[17 18]]
[[19 20]
[21 22]
[23 24]]]
Forma de arr_res:(4, 3, 2)
Esto es particularmente útil para aplanar un array. Y usted aprenderá acerca de eso en la siguiente sección.
Utilizar NumPy reshape() para aplanar una matriz
Hay ocasiones en las que necesitará pasar de matrices N-dimensionales a una matriz aplanada. Supongamos que desea aplanar una imagen en un vector largo de píxeles.
Vamos a codificar un ejemplo sencillo siguiendo los siguientes pasos:
- Genere una matriz de imagen en escala de grises de 3 x 3,
img_arr-con
píxeles en el rango de 0 a 255. - A continuación, aplane esta
img_arr
e imprima la matriz aplanada,flat_arr
. - Imprima también las formas de
img_arr
yflat_arr
para verificarlo.
img_arr = np.random.randint(0, 255, (3,3))
print(img_arr)
print(f "Forma de img_arr: {img_arr.shape}")
flat_arr = img_arr.reshape(-1)
print(flat_arr)
print(f "Forma de flat_arr: {flat_arr.shape}")
Aquí está la salida.
[[195 145 77]
[ 63 193 223]
[215 43 36]]
Forma de img_arr: (3, 3)
[195 145 77 63 193 223 215 43 36]
Forma de flat_arr: (9,)
En la celda de código anterior, puede ver que flat_arr
es un vector 1D de valores de píxeles con 9 elementos.
Sumando Up👩🏫
Es hora de repasar rápidamente lo que hemos aprendido.
- Utilice np.reshape(arr, newshape) para remodelar arr con la forma especificada en newshape. newshape es una tupla que especifica las dimensiones de la matriz remodelada.
- Alternativamente, utilice arr.reshape(d0, d1, ..., dn) para remodelar arr para que tenga la forma d0 x d1 x ... x dn
- Compruebe si d0 * d1 * ...* dn = N, el número de elementos de la matriz original, para evitar errores de valor durante la remodelación.
- Utilice -1 para como máximo una dimensión en la nueva forma si desea que la dimensión se infiera automáticamente.
- Por último, puede utilizar arr.reshape(-1) para aplanar la matriz.
Ahora que ya sabe cómo utilizar NumPy reshape(), aprenda cómo funciona la función NumPy linspace().
Si lo desea, puede probar los ejemplos de código en el cuaderno Jupyter. Si busca otros entornos de desarrollo, consulte nuestra guía sobre alternativas a Jupyter.