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 matchnp.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
| Funcao | Eixo | Cria novo eixo? | Tratamento de entrada 1D |
|---|---|---|---|
np.concatenate | Existente (padrao 0) | Nao | Concatena como esta |
np.vstack | 0 (vertical) | Nao | Trata 1D como linha |
np.hstack | 1 (horizontal) | Nao | Concatena arrays 1D |
np.stack | Novo eixo | Sim (+1 dimensao) | Cria nova dimensao |
np.column_stack | 1 | Nao | Trata 1D como coluna |
np.row_stack | 0 | Nao | Igual 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.