Skip to content

NumPy Concatenate: Unir Arrays con np.concatenate, vstack y hstack

Updated on

Combinar arrays es una de las operaciones mas comunes en la computacion numerica. Divides datos para procesarlos y luego necesitas reensamblarlos. Cargas caracteristicas de multiples fuentes en una sola matriz. Apilas predicciones de multiples modelos para ensamblaje. Usar listas de Python para combinar arrays con bucles o + destruye el rendimiento y crea copias innecesariamente.

NumPy proporciona funciones especializadas para unir arrays que operan a velocidad de C y te dan control preciso sobre en que eje concatenar. Esta guia cubre np.concatenate(), np.vstack(), np.hstack(), np.stack() y sus casos de uso.

📚

np.concatenate() -- La funcion principal

np.concatenate() une una secuencia de arrays a lo largo de un eje existente.

Arrays 1D

import numpy as np
 
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
c = np.array([7, 8, 9])
 
result = np.concatenate([a, b, c])
print(result)  # [1 2 3 4 5 6 7 8 9]
print(result.shape)  # (9,)

Arrays 2D a lo largo de filas (axis=0)

import numpy as np
 
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
 
# Apilar verticalmente (agregar filas)
result = np.concatenate([a, b], axis=0)
print(result)
# [[1 2]
#  [3 4]
#  [5 6]
#  [7 8]]
print(result.shape)  # (4, 2)

Arrays 2D a lo largo de columnas (axis=1)

import numpy as np
 
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
 
# Apilar horizontalmente (agregar columnas)
result = np.concatenate([a, b], axis=1)
print(result)
# [[1 2 5 6]
#  [3 4 7 8]]
print(result.shape)  # (2, 4)

Requisitos de forma

Todos los arrays deben tener la misma forma excepto a lo largo del eje de concatenacion.

import numpy as np
 
a = np.ones((3, 4))    # 3 filas, 4 columnas
b = np.zeros((2, 4))   # 2 filas, 4 columnas
 
# OK: diferente numero de filas, mismo numero de columnas, axis=0
result = np.concatenate([a, b], axis=0)
print(result.shape)  # (5, 4)
 
# ERROR: diferente numero de columnas
c = np.ones((3, 5))
# np.concatenate([a, c], axis=0)  # ValueError: dimensions don't match

np.vstack() -- Apilamiento vertical

np.vstack() apila arrays verticalmente (a lo largo del eje 0). Equivalente a np.concatenate(arrays, axis=0) pero tambien maneja arrays 1D tratandolos como filas individuales.

import numpy as np
 
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
 
# vstack trata arrays 1D como filas
result = np.vstack([a, b])
print(result)
# [[1 2 3]
#  [4 5 6]]
print(result.shape)  # (2, 3)
 
# Con arrays 2D
c = np.array([[1, 2], [3, 4]])
d = np.array([[5, 6]])
result = np.vstack([c, d])
print(result)
# [[1 2]
#  [3 4]
#  [5 6]]

np.hstack() -- Apilamiento horizontal

np.hstack() apila arrays horizontalmente (a lo largo del eje 1 para 2D, eje 0 para 1D).

import numpy as np
 
# Arrays 1D: concatena como np.concatenate
a = np.array([1, 2, 3])
b = np.array([4, 5])
result = np.hstack([a, b])
print(result)  # [1 2 3 4 5]
 
# Arrays 2D: agrega columnas
c = np.array([[1], [2], [3]])
d = np.array([[4], [5], [6]])
result = np.hstack([c, d])
print(result)
# [[1 4]
#  [2 5]
#  [3 6]]

np.stack() -- Crea un nuevo eje

A diferencia de concatenate, stack une arrays a lo largo de un nuevo eje, incrementando la cantidad de dimensiones en 1.

import numpy as np
 
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
 
# Apilar a lo largo del nuevo eje 0 (predeterminado)
result = np.stack([a, b])
print(result)
# [[1 2 3]
#  [4 5 6]]
print(result.shape)  # (2, 3)
 
# Apilar a lo largo del nuevo eje 1
result = np.stack([a, b], axis=1)
print(result)
# [[1 4]
#  [2 5]
#  [3 6]]
print(result.shape)  # (3, 2)

Todos los arrays de entrada deben tener la misma forma para np.stack().

Comparacion de funciones

FuncionEjeCrea nuevo eje?Manejo de entrada 1D
np.concatenateExistente (predeterminado 0)NoConcatena tal cual
np.vstack0 (vertical)NoTrata 1D como fila
np.hstack1 (horizontal)NoConcatena arrays 1D
np.stackNuevo ejeSi (+1 dimension)Crea nueva dimension
np.column_stack1NoTrata 1D como columna
np.row_stack0NoIgual que vstack

Ejemplos practicos

Combinar caracteristicas para aprendizaje automatico

import numpy as np
 
# Arrays de caracteristicas de diferentes fuentes
ages = np.array([25, 30, 35, 40])
incomes = np.array([50000, 60000, 75000, 90000])
scores = np.array([720, 680, 750, 800])
 
# Apilar como columnas para crear matriz de caracteristicas
X = np.column_stack([ages, incomes, scores])
print(X)
# [[   25 50000   720]
#  [   30 60000   680]
#  [   35 75000   750]
#  [   40 90000   800]]
print(X.shape)  # (4, 3)

Resultados de procesamiento por lotes

import numpy as np
 
# Procesar datos en lotes, combinar resultados
results = []
for batch_start in range(0, 100, 25):
    batch = np.random.randn(25, 10)  # 25 muestras, 10 caracteristicas
    processed = batch * 2 + 1  # Algun procesamiento
    results.append(processed)
 
# Combinar todos los lotes verticalmente
all_results = np.vstack(results)
print(all_results.shape)  # (100, 10)

Procesamiento de imagenes -- Combinar canales

import numpy as np
 
height, width = 100, 100
 
# Canales de color separados
red = np.random.randint(0, 256, (height, width))
green = np.random.randint(0, 256, (height, width))
blue = np.random.randint(0, 256, (height, width))
 
# Combinar en imagen RGB
rgb_image = np.stack([red, green, blue], axis=2)
print(rgb_image.shape)  # (100, 100, 3)

Visualizar datos combinados

Despues de concatenar arrays de diferentes fuentes, PyGWalker (opens in a new tab) te permite explorar el conjunto de datos combinado de forma interactiva en Jupyter:

import pandas as pd
import pygwalker as pyg
 
# Convertir array concatenado a DataFrame
df = pd.DataFrame(X, columns=['age', 'income', 'score'])
walker = pyg.walk(df)

FAQ

Cual es la diferencia entre np.concatenate y np.stack?

np.concatenate une arrays a lo largo de un eje existente sin cambiar el numero de dimensiones. np.stack une arrays a lo largo de un nuevo eje, agregando una dimension. Por ejemplo, apilar dos arrays (3,) con concatenate da (6,), mientras que stack da (2, 3).

Que significa axis en np.concatenate?

El parametro axis especifica a lo largo de que dimension unir. axis=0 concatena a lo largo de las filas (agregando mas filas), axis=1 a lo largo de las columnas (agregando mas columnas). Para arrays 2D, axis=0 es apilamiento vertical y axis=1 es apilamiento horizontal.

Cuando deberia usar vstack vs hstack vs concatenate?

Usa vstack para agregar filas (apilar verticalmente), hstack para agregar columnas (apilar horizontalmente) y concatenate cuando necesites especificar un eje arbitrario. vstack y hstack son funciones de conveniencia que manejan arrays 1D de forma mas intuitiva que concatenate.

Por que obtengo un ValueError al concatenar arrays?

Todos los arrays deben tener la misma forma excepto a lo largo del eje de concatenacion. Si estas concatenando a lo largo de axis=0, todos los arrays deben tener el mismo numero de columnas. Verifica las formas con array.shape antes de concatenar.

Como concateno arrays de diferentes dimensiones?

Primero remodela los arrays para que tengan dimensiones compatibles. Usa np.expand_dims(array, axis) para agregar una dimension, o array.reshape(new_shape). Por ejemplo, para hacer vstack de un array 1D con uno 2D, remodela el array 1D: array.reshape(1, -1).

Conclusion

NumPy proporciona un conjunto completo de herramientas para unir arrays: np.concatenate() para union de proposito general a lo largo de cualquier eje, np.vstack()/np.hstack() para apilamiento vertical/horizontal intuitivo, y np.stack() cuando necesitas crear una nueva dimension. Recuerda que concatenate une a lo largo de ejes existentes mientras que stack crea nuevos. Ajusta las dimensiones cuidadosamente y usa vstack/hstack para el codigo mas legible al trabajar con operaciones comunes de filas/columnas.

📚