Skip to content

NumPy Concatenate: Unir Arrays com np.concatenate, vstack e hstack

Updated on

Combinar arrays e uma das operacoes mais comuns na computacao numerica. Voce divide dados para processamento e depois precisa reuni-los. Carrega caracteristicas de multiplas fontes em uma unica matriz. Empilha previsoes de multiplos modelos para ensemble. Usar listas Python para combinar arrays com loops ou + destroi a performance e cria copias desnecessariamente.

NumPy fornece funcoes especializadas para unir arrays que operam em velocidade C e dao controle preciso sobre qual eixo concatenar. Este guia cobre np.concatenate(), np.vstack(), np.hstack(), np.stack() e seus casos de uso.

📚

np.concatenate() -- A funcao principal

np.concatenate() une uma sequencia de arrays ao longo de um eixo 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 ao longo das linhas (axis=0)

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

Arrays 2D ao longo das colunas (axis=1)

import numpy as np
 
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
 
# Empilhar horizontalmente (adicionar colunas)
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 os arrays devem ter a mesma forma exceto ao longo do eixo de concatenacao.

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

np.vstack() -- Empilhamento vertical

np.vstack() empilha arrays verticalmente (ao longo do eixo 0). Equivalente a np.concatenate(arrays, axis=0), mas tambem trata arrays 1D como linhas individuais.

import numpy as np
 
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
 
# vstack trata arrays 1D como linhas
result = np.vstack([a, b])
print(result)
# [[1 2 3]
#  [4 5 6]]
print(result.shape)  # (2, 3)
 
# Com 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() -- Empilhamento horizontal

np.hstack() empilha arrays horizontalmente (ao longo do eixo 1 para 2D, eixo 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: adiciona colunas
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() -- Cria um novo eixo

Diferente de concatenate, stack une arrays ao longo de um novo eixo, aumentando a contagem de dimensoes em 1.

import numpy as np
 
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
 
# Empilhar ao longo do novo eixo 0 (padrao)
result = np.stack([a, b])
print(result)
# [[1 2 3]
#  [4 5 6]]
print(result.shape)  # (2, 3)
 
# Empilhar ao longo do novo eixo 1
result = np.stack([a, b], axis=1)
print(result)
# [[1 4]
#  [2 5]
#  [3 6]]
print(result.shape)  # (3, 2)

Todos os arrays de entrada devem ter a mesma forma para np.stack().

Comparacao de funcoes

FuncaoEixoCria novo eixo?Tratamento de entrada 1D
np.concatenateExistente (padrao 0)NaoConcatena como esta
np.vstack0 (vertical)NaoTrata 1D como linha
np.hstack1 (horizontal)NaoConcatena arrays 1D
np.stackNovo eixoSim (+1 dimensao)Cria nova dimensao
np.column_stack1NaoTrata 1D como coluna
np.row_stack0NaoIgual ao vstack

Exemplos praticos

Combinar caracteristicas para aprendizado de maquina

import numpy as np
 
# Arrays de caracteristicas de diferentes fontes
ages = np.array([25, 30, 35, 40])
incomes = np.array([50000, 60000, 75000, 90000])
scores = np.array([720, 680, 750, 800])
 
# Empilhar como colunas para criar 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 processamento em lote

import numpy as np
 
# Processar dados em lotes, combinar resultados
results = []
for batch_start in range(0, 100, 25):
    batch = np.random.randn(25, 10)  # 25 amostras, 10 caracteristicas
    processed = batch * 2 + 1  # Algum processamento
    results.append(processed)
 
# Combinar todos os lotes verticalmente
all_results = np.vstack(results)
print(all_results.shape)  # (100, 10)

Processamento de imagens -- Combinar canais

import numpy as np
 
height, width = 100, 100
 
# Canais de cor 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 em imagem RGB
rgb_image = np.stack([red, green, blue], axis=2)
print(rgb_image.shape)  # (100, 100, 3)

Visualizar dados combinados

Apos concatenar arrays de diferentes fontes, PyGWalker (opens in a new tab) permite explorar o conjunto de dados combinado interativamente no Jupyter:

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

FAQ

Qual e a diferenca entre np.concatenate e np.stack?

np.concatenate une arrays ao longo de um eixo existente sem alterar o numero de dimensoes. np.stack une arrays ao longo de um novo eixo, adicionando uma dimensao. Por exemplo, empilhar dois arrays (3,) com concatenate resulta em (6,), enquanto stack resulta em (2, 3).

O que significa axis em np.concatenate?

O parametro axis especifica ao longo de qual dimensao unir. axis=0 concatena ao longo das linhas (adicionando mais linhas), axis=1 ao longo das colunas (adicionando mais colunas). Para arrays 2D, axis=0 e empilhamento vertical e axis=1 e empilhamento horizontal.

Quando devo usar vstack vs hstack vs concatenate?

Use vstack para adicionar linhas (empilhar verticalmente), hstack para adicionar colunas (empilhar horizontalmente) e concatenate quando precisar especificar um eixo arbitrario. vstack e hstack sao funcoes de conveniencia que tratam arrays 1D de forma mais intuitiva que concatenate.

Por que recebo um ValueError ao concatenar arrays?

Todos os arrays devem ter a mesma forma exceto ao longo do eixo de concatenacao. Se esta concatenando ao longo de axis=0, todos os arrays devem ter o mesmo numero de colunas. Verifique as formas com array.shape antes de concatenar.

Como concateno arrays de dimensoes diferentes?

Remolde os arrays para terem dimensoes compativeis primeiro. Use np.expand_dims(array, axis) para adicionar uma dimensao, ou array.reshape(new_shape). Por exemplo, para fazer vstack de um array 1D com um 2D, remolde o array 1D: array.reshape(1, -1).

Conclusao

NumPy fornece um conjunto completo de ferramentas para unir arrays: np.concatenate() para uniao de proposito geral ao longo de qualquer eixo, np.vstack()/np.hstack() para empilhamento vertical/horizontal intuitivo, e np.stack() quando voce precisa criar uma nova dimensao. Lembre-se que concatenate une ao longo de eixos existentes enquanto stack cria novos. Combine as dimensoes cuidadosamente e use vstack/hstack para o codigo mais legivel ao trabalhar com operacoes comuns de linhas/colunas.

📚