Cómo aplanar sólo algunas dimensiones de una matriz numpy

Resuelto IssamLaradji asked hace 11 años • 5 respuestas

¿Existe una manera rápida de "subaplanar" o aplanar solo algunas de las primeras dimensiones en una matriz numerosa?

Por ejemplo, dada una gran variedad de dimensiones (50,100,25), las dimensiones resultantes serían(5000,25)

IssamLaradji avatar Sep 12 '13 14:09 IssamLaradji
Aceptado

Eche un vistazo a numpy.reshape .

>>> arr = numpy.zeros((50,100,25))
>>> arr.shape
# (50, 100, 25)

>>> new_arr = arr.reshape(5000,25)
>>> new_arr.shape   
# (5000, 25)

# One shape dimension can be -1. 
# In this case, the value is inferred from 
# the length of the array and remaining dimensions.
>>> another_arr = arr.reshape(-1, arr.shape[-1])
>>> another_arr.shape
# (5000, 25)
Alexander avatar Sep 12 '2013 07:09 Alexander

Una ligera generalización de la respuesta de Alexander: np.reshape puede tomar -1 como argumento, lo que significa "tamaño total de la matriz dividido por el producto de todas las demás dimensiones enumeradas":

por ejemplo, para aplanar todas las dimensiones excepto la última:

>>> arr = numpy.zeros((50,100,25))
>>> new_arr = arr.reshape(-1, arr.shape[-1])
>>> new_arr.shape
# (5000, 25)
Peter avatar Oct 24 '2014 18:10 Peter

Una ligera generalización de la respuesta de Peter: puede especificar un rango sobre la forma de la matriz original si desea ir más allá de las matrices tridimensionales.

por ejemplo, para aplanar todas las dimensiones excepto las dos últimas:

arr = numpy.zeros((3, 4, 5, 6))
new_arr = arr.reshape(-1, *arr.shape[-2:])
new_arr.shape
# (12, 5, 6)

EDITAR: Una ligera generalización de mi respuesta anterior; por supuesto, también puede especificar un rango al comienzo de la remodelación:

arr = numpy.zeros((3, 4, 5, 6, 7, 8))
new_arr = arr.reshape(*arr.shape[:2], -1, *arr.shape[-2:])
new_arr.shape
# (3, 4, 30, 7, 8)
KeithWM avatar Dec 11 '2017 12:12 KeithWM