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 matchnp.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
| Funcion | Eje | Crea nuevo eje? | Manejo de entrada 1D |
|---|---|---|---|
np.concatenate | Existente (predeterminado 0) | No | Concatena tal cual |
np.vstack | 0 (vertical) | No | Trata 1D como fila |
np.hstack | 1 (horizontal) | No | Concatena arrays 1D |
np.stack | Nuevo eje | Si (+1 dimension) | Crea nueva dimension |
np.column_stack | 1 | No | Trata 1D como columna |
np.row_stack | 0 | No | Igual 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.