Supongamos que tengo;
LIST = [[array([1, 2, 3, 4, 5]), array([1, 2, 3, 4, 5],[1,2,3,4,5])] # inner lists are numpy arrays
Trato de convertir;
array([[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5])
Lo estoy resolviendo iterando en vstack en este momento, pero es realmente lento para LIST especialmente grande
¿Qué sugieres para la mejor manera eficiente?
LIST = [[array([1, 2, 3, 4, 5]), array([1, 2, 3, 4, 5],[1,2,3,4,5])]
esta no es la sintaxis correcta de Python. Por favor aclare.Respuestas:
En general, puede concatenar una secuencia completa de matrices a lo largo de cualquier eje:
pero usted no tiene que preocuparse por la forma y la dimensión de cada matriz en la lista (para una salida de 3x5 de 2 dimensiones, es necesario asegurarse de que todos ellos son de 2 dimensiones matrices n-por-5 ya). Si desea concatenar matrices unidimensionales como filas de una salida bidimensional, debe ampliar su dimensionalidad.
Como señala la respuesta de Jorge, también existe la función
stack
, introducida en numpy 1.10:Esto toma el enfoque complementario: crea una nueva vista de cada matriz de entrada y agrega una dimensión adicional (en este caso, a la izquierda, por lo que cada
n
matriz 1D -elemento se convierte en una matriz 1 porn
2D) antes de concatenar. Solo funcionará si todas las matrices de entrada tienen la misma forma, incluso a lo largo del eje de concatenación.vstack
(o equivalentementerow_stack
) es a menudo una solución más fácil de usar porque tomará una secuencia de matrices de 1 y / o 2 dimensiones y expandirá la dimensionalidad automáticamente donde sea necesario y solo cuando sea necesario, antes de concatenar la lista completa. Cuando se requiere una nueva dimensión, se agrega a la izquierda. Nuevamente, puede concatenar una lista completa a la vez sin necesidad de iterar:Este comportamiento flexible también se muestra en el atajo sintáctico
numpy.r_[ array1, ...., arrayN ]
(observe los corchetes). Esto es bueno para concatenar algunas matrices con nombres explícitos, pero no es bueno para su situación porque esta sintaxis no aceptará una secuencia de matrices, como suLIST
.También hay una función
column_stack
y un atajo análogosc_[...]
, para el apilamiento horizontal (en columnas), así como una función casi análoga,hstack
aunque por alguna razón esta última es menos flexible (es más estricta en cuanto a la dimensionalidad de las matrices de entrada e intenta concatenar Matrices 1-D de extremo a extremo en lugar de tratarlas como columnas).Finalmente, en el caso específico de apilamiento vertical de matrices 1-D, lo siguiente también funciona:
... porque las matrices se pueden construir a partir de una secuencia de otras matrices, agregando una nueva dimensión al principio.
fuente
A partir de la versión 1.10 de NumPy, tenemos la pila de métodos . Puede apilar matrices de cualquier dimensión (todas iguales):
Disfrutar,
fuente
¡Revisé algunos de los métodos para el rendimiento de la velocidad y descubrí que no hay diferencia! La única diferencia es que al usar algunos métodos, debe verificar cuidadosamente la dimensión.
Sincronización:
Como puede ver, probé 2 experimentos: usando
np.random.rand(10000)
ynp.random.rand(1, 10000)
Y si usamos matrices 2dnp.stack
ynp.array
creamos una dimensión adicional, result.shape es (1,10000,10000) y (10000,1,10000), por lo que necesitan acciones adicionales para evitar esto .Código:
fuente