Concatenar dos matrices NumPy verticalmente

Intenté lo siguiente:

>>> a = np.array([1,2,3]) >>> b = np.array([4,5,6]) >>> np.concatenate((a,b), axis=0) array([1, 2, 3, 4, 5, 6]) >>> np.concatenate((a,b), axis=1) array([1, 2, 3, 4, 5, 6]) 

Sin embargo, esperaría que al menos un resultado se vea así.

 array([[1, 2, 3], [4, 5, 6]]) 

¿Por qué no se concatena verticalmente?

Debido a que a y b solo tienen un eje, ya que su forma es (3) , y el parámetro de eje se refiere específicamente al eje de los elementos a concatenar.

Este ejemplo debería aclarar qué está haciendo la concatenate con el eje. Toma dos vectores con dos ejes, con forma (2,3) :

 a = np.array([[1,5,9], [2,6,10]]) b = np.array([[3,7,11], [4,8,12]]) 

concatena a lo largo del primer eje (filas del primero, luego filas del segundo):

 np.concatenate((a,b), axis=0) array([[ 1, 5, 9], [ 2, 6, 10], [ 3, 7, 11], [ 4, 8, 12]]) 

concatena a lo largo del segundo eje (columnas del primero, luego columnas del segundo):

 np.concatenate((a, b), axis=1) array([[ 1, 5, 9, 3, 7, 11], [ 2, 6, 10, 4, 8, 12]]) 

para obtener la salida que presentaste, puedes usar vstack

 a = np.array([1,2,3]) b = np.array([4,5,6]) np.vstack((a, b)) array([[1, 2, 3], [4, 5, 6]]) 

Aún puede hacerlo con concatenate , pero primero debe cambiarlos de forma:

 np.concatenate((a.reshape(1,3), b.reshape(1,3))) array([[1, 2, 3], [4, 5, 6]]) 

Finalmente, como se propuso en los comentarios, una forma de remodelarlos es usar newaxis :

 np.concatenate((a[np.newaxis,:], b[np.newaxis,:])) 

Si el problema real en cuestión es concatenar dos arreglos 1-D verticalmente, y no estamos fijados en el uso de concatenate para realizar esta operación, sugeriría el uso de np.column_stack :

 In []: a = np.array([1,2,3]) In []: b = np.array([4,5,6]) In []: np.column_stack((a, b)) array([[1, 4], [2, 5], [3, 6]]) 

Una característica no conocida de numpy es usar r_ . Esta es una manera simple de construir arreglos rápidamente:

 import numpy as np a = np.array([1,2,3]) b = np.array([4,5,6]) c = np.r_[a[None,:],b[None,:]] print(c) #[[1 2 3] # [4 5 6]] 

El propósito de a[None,:] es agregar un eje a la matriz a .

 a = np.array([1,2,3]) b = np.array([4,5,6]) np.array((a,b)) 

funciona tan bien como

 np.array([[1,2,3], [4,5,6]]) 

Independientemente de si se trata de una lista de listas o una lista de matrices 1d, np.array intenta crear una matriz 2d.

Pero también es una buena idea entender cómo funcionan np.concatenate y su familia de funciones de stack . En este contexto, concatenate necesita una lista de arreglos 2d (o cualquier cosa que np.array se convierta en un arreglo 2d) como entradas.

np.vstack primero realiza un bucle a través de las entradas, asegurándose de que estén al menos 2d y luego concatene. Funcionalmente, es lo mismo que expandir las dimensiones de los arreglos usted mismo.

np.stack es una nueva función que une las matrices en una nueva dimensión. Por defecto se comporta como np.array .

Mira el código de estas funciones. Si está escrito en Python puede aprender bastante. Para vstack :

 return _nx.concatenate([atleast_2d(_m) for _m in tup], 0)