Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Shape y Reshape

6/24
Recursos

Aportes 22

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Tengo una anécdota con respecto a la forma de recorrer el array como lo hace C y Fortran para un ramo de la universidad llamado dinámica de fluidos computacional, yo estaba acostumbrado a programar en C, pero ese ramo tenía profes franceses que hacían todo en Fortran, y al momento de realizar el proyecto final, donde había muchas matrices, ecuaciones de Navier Stokes, y acostumbrado a realizar el típico for i for j, me daban resultados que no cumplían con la física del problema, el fluido en vez de acelerar se frenaba, revisé mil veces las ecuaciones y mi código y no encontraba el error, envíe el trabajo así no más (esto fue en enero de 2018), dos años más tarde, estudiando este mismo tema de reshape de numpy durante el 2020, me entero del parámetro ‘C’ y ‘F’ y que la forma de recorrer los arreglos de ambos lenguajes eran diferentes y quede así 🤡, espero se entienda a quien lea esto XD

🟦🔹Shape y Reshape


Shape me indica la forma del arreglo
Reshape transforma el arreglo mientras se mantengan los elementos.

arr = np.random.randint(1,10,(3,2))
arr.shape
----> (3, 2)
arr
----> array([[4, 2],
       [4, 8],
       [4, 3]])
arr.reshape(1,6)
----> array([[4, 2, 4, 8, 4, 3]])
arr.reshape(2,3)
----> array([[4, 2, 4],
       [8, 4, 3]])
np.reshape(arr,(1,6))
----> array([[4, 2, 4, 8, 4, 3]])

Se puede hacer un reshape como lo haría C.

np.reshape(arr,(2,3), 'C')
----> array([[4, 2, 4],
       [8, 4, 3]])

También se puede hacer reshape a como lo haría Fortran.

np.reshape(arr,(2,3), 'F')
----> array([[4, 4, 8],
       [4, 2, 3]])

Además existe la opción de hacer reshape según como esté optimizado nuestro computador. En este caso es como en C.

np.reshape(arr,(2,3), 'A')
----> array([[4, 2, 4],
       [8, 4, 3]])

Reto

Crear un array de cualquier dimesnión y cambiar sus dimensiones
Intentar cambiar el array de forma que no respete la estructura original
1.


array_original = np.random.randint(0,10, (3,3))
array_original
----> array([[5, 2, 6],
       [6, 3, 6],
       [6, 2, 8]])
array_original.reshape(1,9)
----> array([[5, 2, 6, 6, 3, 6, 6, 2, 8]])
array_original.reshape(2,4)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-126-cdad9318378a> in <module>()
----> 1 array_original.reshape(2,4)

ValueError: cannot reshape array of size 9 into shape (2,4)

Shape y Reshape

Forma ····Como es la estructura del array···· y reforma del array

✅ arr_shape = np.random.randint(Start, End,(3,2)) #Randoms entre 1 y 10 en una matriz (n, n)
✅ arr_shape.reshape(dim, dim)

Reto

#1 Crear un tensor / array con cualq dimensionalidad
#2 Intercambiar valores de array
#3 Crear un valor que no respete los valores originales

print('Generando la matriz...')
arr_reto = np.random.randint(1,100,(4,6))
print(f'La matriz es esta\n{arr_reto}\ntiene {arr_reto.ndim}')

print()

print('Intercambiando las dimensiones + ajuste dimensiones')
print('A')
arr_reto_dims = np.squeeze(arr_reto.reshape(1,24)) #Concatenando Squeeze con el reshape

print(f'La matriz es esta\n{arr_reto_dims}\ntiene {arr_reto_dims.ndim}')

print()
print('B')
arr_reto_dims = np.squeeze(arr_reto.reshape(8,3)) #Concatenando Squeeze con el reshape

print(f'La matriz es esta\n{arr_reto_dims}\ntiene {arr_reto_dims.ndim}')

print()
print('Generando un fallo intencional por incoherencia de dimensiones')
print('arr_reto.reshape(4,10) --> le paso 40 elementos y son 24')

Solucion 👇🏻

Si en el .reshape indicamos -1 como una de las dimensiones, esta será calculada automáticamente por numpy.

arr = np.random.randint(1,10,(4,6))
arr
>
array([[7, 4, 5, 3, 9, 1],
       [7, 2, 9, 7, 2, 6],
       [4, 5, 3, 4, 9, 8],
       [7, 2, 7, 8, 1, 9]])

Aplicamos .reshape con -1

arr.reshape(2,-1)
>
array([[5, 5, 1, 9, 1, 8, 5, 4, 6, 1, 9, 8],
       [6, 7, 1, 8, 4, 5, 4, 1, 9, 2, 6, 9]])

En este caso -1 vale por 12

Aplica para más dimensiones …

arr.reshape(3,2,-1)
>
array([[[7, 4, 5, 3],
        [9, 1, 7, 2]],

       [[9, 7, 2, 6],
        [4, 5, 3, 4]],

       [[9, 8, 7, 2],
        [7, 8, 1, 9]]])

Y en este caso -1 vale por 4.

aqui esta el error si quieres hacerlo mas grande de lo que puede

Reto:

  1. Crear un array de cualquier dimensión y cambiar sus dimensiones
reto = np.random.randint(1,100,(4,3))
print(reto, reto.ndim)

--[[42 38 71]
 [99 43 23]
 [82 58  7]
 [49 79  1]] 2

np.reshape(reto, (3,4),'F')

--array([[42, 49, 58, 23],
       --[99, 38, 79,  7],
       --[82, 43, 71,  1]])
  1. Intercambiar el array de forma que no respete la estructura original
np.reshape(reto,(4,4))

 --ValueError: cannot reshape array of size 12 into shape (4,4)

Ejercicio de reshape:
Matriz NUMPY de 3x3x3 de 3 dimensiones.

mtrz_3x3x3 =np.array([[[1,2,3], [4,5,6], [7,8,9]],[[11,12,13], [14,15,16],[17,18,19]],[[21,22,23], [24,25,26],[27,28,29]]])
mtrz_3x3x3

array([[[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9]],
[[11, 12, 13],
[14, 15, 16],
[17, 18, 19]],
[[21, 22, 23],
[24, 25, 26],
[27, 28, 29]]])

Cambio la estructura a una sola fila en 3D 1x1x27.

mtrz_1x1x27 = mtrz_3x3x3.reshape(1,1,27)
mtrz_1x1x27

array([[[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17,
18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29]]])

Chequeo la nueva forma y la dimension.

mtrz_1x1x27.shape, mtrz_1x1x27.ndim

((1, 1, 27), 3)

Elimino las dimensiones redundantes. Me queda el formato inputs de algunas redes neuronales. Chequeo la forma y la dimension.

array_rs = np.squeeze(mtrz_1x1x27)
array_rs, array_rs.shape, array_rs.ndim

(array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18,
19, 21, 22, 23, 24, 25, 26, 27, 28, 29]), (27,), 1)

Uso reshape sin conservar la cantidad de elementos que tiene el array (size).

array_rs.reshape(3,4)

ValueError Traceback (most recent call last)

<ipython-input-23-d3df73044a0d> in <module>()
1 # Uso reshape sin conservar la contidad de elementos que tiene el array
----> 2 array_rs.reshape(3,4)

ValueError: cannot reshape array of size 27 into shape (3,4)

El mensaje es que el reshape tiene que conservar el size de 27 del array.

Un detalle curioso, si tenemos una matriz de dos dimensiones, usando reshape se puede transformar en una matriz de una sola dimensión; siempre y cuando cumpla con el tamaño de la original.

matrizb = np.random.randint(1,10,(2,5))
matriz_reto =np.reshape(matrizb,(5,2))
matriz_reto

array([[7, 2],
[4, 9],
[7, 2],
[1, 9],
[2, 7]])

np.reshape(matriz_reto,(2,6))


ValueError Traceback (most recent call last)
<ipython-input-67-be5315789a87> in <module>
----> 1 np.reshape(matriz_reto,(2,6))

<array_function internals> in reshape(*args, **kwargs)

~/anaconda3/lib/python3.8/site-packages/numpy/core/fromnumeric.py in reshape(a, newshape, order)
299 [5, 6]])
300 “”"
–> 301 return _wrapfunc(a, ‘reshape’, newshape, order=order)
302
303

~/anaconda3/lib/python3.8/site-packages/numpy/core/fromnumeric.py in _wrapfunc(obj, method, *args, **kwds)
59
60 try:
—> 61 return bound(*args, **kwds)
62 except TypeError:
63 # A TypeError occurs if the object does have such a method in its

ValueError: cannot reshape array of size 10 into shape (2,6)

A la hora de hacer reshape hay que respetar esta pequeña ley.

X * Y == Número de elementos totales dentro del array

tensor = np.random.randint(1,100,(3,3,3))
print(tensor)
print(tensor.shape)
print(tensor.reshape(1,9,3))
print(tensor.reshape(9,3,1))
print(tensor.reshape(9,3,2))

Muy divertido hacer un reto que te lleva a un error.
Acá muestro cómo:
Creo el array:

arr_reto_shr = np.random.randint(1,11,(4,4))
print(arr_reto_shr)
arr_reto_shr.shape

Cambio la estructura de una forma viable:

np.reshape(arr_reto_shr,(1,16))

Intento cambiarla a una forma NO viable:

np.reshape(arr_reto_shr,(2,24))

Claramente me da un error de valor.

en mi caso habian 16 datos originalmente y solo acepta estructuras donde quepan 16 datos exactamente ni mas ni meno… es lo que entendi probando el reshape en mi notebook jupyter.

arr = np.random.randint(1,10,(4,4))

arr

array([[3, 5, 8, 6],
       [9, 9, 8, 6],
       [8, 7, 6, 5],
       [4, 6, 3, 7]])

arr.reshape(1,16)

array([[3, 5, 8, 6, 9, 9, 8, 6, 8, 7, 6, 5, 4, 6, 3, 7]])

arr.reshape(1,15)

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Input In [35], in <cell line: 1>()
----> 1 arr.reshape(1,15)

ValueError: cannot reshape array of size 16 into shape (1,15)

RETO CUMPLIDO!

  • Crear un array de cualquier dimension y cambie sus dimensiones
array = np.random.randint(0,100,(2,6))
array
----> array([[10, 90, 33, 94, 24,  4],
           	 [90, 39, 67, 46, 53, 45]])

array.reshape(4,3)
----> array([[10, 90, 33],
       		   [94, 24,  4],
       		   [90, 39, 67],
       		   [46, 53, 45]])

array.reshape(3,4)
----> array([[10, 90, 33, 94],
	           [24,  4, 90, 39],
        	   [67, 46, 53, 45]])

-Cambie las dimensiones del array de manera que sobrepase el numero de elementos que contiene

array.reshape(4,4)
-----> ValueError: cannot reshape array of size 12 into shape (4,4)

Hola, al hacer un array 7x5 e intentar cambiarlo a 2x3 muestra el siguiente error:
ValueError: cannot reshape array of size 35 into shape (2,3)

Reto:

Primera parte:

tensor_5d = np.random.randint(1,10,(3,3,3,3,3))
print(tensor_5d)
np.reshape(tensor_5d,(1,243), 'F')

Segunda Parte:

np.reshape(tensor_5d,(1,120), 'F')
___________________________
ValueError: cannot reshape array of size 243 into shape (1,120)

Reto completado

challege = np.random.randint(12,1025,(6,8))
print(challege, "\n", "\n")


challenge_reshape = challege.reshape(4,12)
print(challenge_reshape, "\n", "\n")

challenge_error = challege.reshape(6,7)
print(challenge_error)

#Se ordena basado en Lenguaje C
numpy_c_especifico = np.reshape(array,(1,8),'C')
print('Especificando de manera explicita: \n{}'.format(numpy_c_especifico))
#Se ordena basado en Lenguaje C por defecto
array_reshape_defecto = array.reshape(4,2)
print(f'Especificando de manera implicita: \n{array_reshape_defecto}')

RESULTADO:
Especificando de manera explicita: 
[[6 6 9 6 0 5 3 8]]
Especificando de manera implicita: 
[[6 6]
 [9 6]
 [0 5]
 [3 8]]

Reto Solucionado!!
Creando array

Modificando dimensiones del array