Indexação e Remodelagem do NumPy
A indexação seleciona e reorganiza dados de ndarray ao longo de eixos; a remodelação altera a forma sem mudar os valores quando o tamanho total permanece constante.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
import numpy as np
matrix = np.arange(12).reshape(3, 4)
rows = matrix[1:3, ::2] # fatia linhas 1-2, cada outra coluna
cols = matrix[:, [0, 3]] # indexa avançadamente colunas 0 e 3
flat = matrix.reshape(-1) # view 1-D quando possívelQuando usar isso:
- Extrair submatrizes para processamento em lote
- Reordenar dimensões antes de passar dados para modelos de ML
- Construir máscaras para atualizações condicionais
- Alinhar formas para broadcasting entre eixos
Exemplo de Trabalho
import numpy as np
# 4 regiões x 6 meses
sales = np.array(
[[10, 12, 11, 13, 14, 15],
[8, 9, 10, 9, 11, 12],
[20, 18, 19, 21, 22, 23],
[5, 6, 5, 7, 6, 8]],
dtype=np.int32,
)
# Apenas Q1: meses 0-2, todas as regiões
q1 = sales[:, 0:3]
# Duas principais regiões por vendas totais
totals = sales.sum(axis=1)
top_idx = np.argsort(totals)[-2:]
top_regions = sales[top_idx]
# Empilha vetores de região como colunas para correlação
wide = sales.T # shape (6, 4) - meses como linhas
# Marca meses em que qualquer região superou 20
hot_months = np.where(sales.max(axis=0) >= 20)[0]
print("q1 shape:", q1.shape)
print("top regions:", top_idx)
print("hot months:", hot_months)O que isso demonstra:
- Fatiamento de colunas com
start:stopemaxis=1 - Redução ao longo de
axis=1e depoisargsortpara seleção de linhas .Ttranspose como um atalho de remodelaçãonp.whereemmax(axis=0)para indexar colunas por condição
Mergulho Profundo
Como Funciona
- O fatiamento básico (
start:stop:step) usa strides para produzir uma view que compartilha memória. - A indexação com array de inteiros coleta elementos em ordem arbitrária e geralmente copia.
- Máscaras booleanas devem corresponder à forma broadcastable;
arr[mask]retorna uma seleção 1-D. reshaperetorna uma view quando os strides permitem; caso contrário, ele copia.
Modos de Indexação
| Estilo | Exemplo | Cópia? |
|---|---|---|
| Fatia | a[2:5] | Geralmente view |
| Lista de inteiros | a[[1, 3]] | Cópia |
| Máscara booleana | a[a > 0] | Cópia |
np.take | np.take(a, idx, axis=0) | Configurável |
Convenções de Eixo
axis | Significado 2-D |
|---|---|
0 | Para baixo nas linhas (agrega colunas) |
1 | Através das colunas (agrega linhas) |
-1 | Última dimensão |
Notas de Python
import numpy as np
# Insere eixo para broadcasting
row = np.array([1, 2, 3])
col = row[:, np.newaxis] # shape (3, 1)
# ravel vs flatten: flatten sempre copia
a = np.arange(6).reshape(2, 3)
flat_view = a.ravel()
flat_copy = a.flatten()Armadilhas
- Atribuição através de índice avançado -
a[[0, 1]] = 5pode não se comportar como atribuição de fatia repetida. Correção: atribua a.copy()ou usenp.put. - Views com strides negativos - inverter com
a[::-1]pode fazer com que alguns reshape copiem inesperadamente. Correção: chame.copy()antes de extensões C downstream. - Forma da máscara booleana -
a[mask]em 2-D precisa da forma da máscara(rows, cols)ou broadcastable. Correção:mask = mask & (a > 0)com formas alinhadas. - Fatias off-by-one -
a[1:3]exclui o índice 3; diferente derange. Correção: lembre-se que o stop é exclusivo. - Incompatibilidade de tamanho de reshape -
reshape(3, 5)em 12 elementos gera um erro. Correção: use-1para uma dimensão inferida:reshape(3, -1).
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
np.einsum | Contrações explícitas de tensor | Seleções simples de linha/coluna |
pandas .loc | Linhas/colunas rotuladas | Kernels ndarray puramente numéricos |
np.take_along_axis | Ordenando valores por linha | Fatias de matriz inteira são suficientes |
np.moveaxis | Reordenando tensores 3-D+ | .T simples em 2-D |
FAQs
Qual é a diferença entre view e copy?
- Views compartilham o buffer de dados; cópias são independentes.
- Mutar uma view afeta o pai, a menos que você tenha copiado primeiro.
Como seleciono uma linha a cada duas?
import numpy as np
a = np.arange(10)
every_other = a[::2]Como troco linhas e colunas?
matrix.Tounp.transpose(matrix)para 2-D.np.swapaxes(a, 0, 1)quando rank > 2.
O reshape pode mudar o total de elementos?
- Não - o tamanho total deve corresponder:
np.prod(shape) == a.size. - Use
np.resizeapenas quando você intencionalmente deseja repetição ou truncamento.
Como indexo um volume 3-D?
vol[z, y, x]- eixo mais lento primeiro em ordem C.- Documente o significado do eixo nas docstrings da função.
Por que a indexação plana difere da 2-D?
a[5]em 2-D usa o índice ravel em ordem C.- Prefira
a[row, col]ounp.unravel_indexpara clareza.
Como filtro e mantenho a forma 2-D?
- Máscara booleana nas linhas:
a[mask, :]mantém as colunas intactas. a[mask]sozinho sempre achata os elementos selecionados para 1-D.
O que faz a reticências `...`?
a[..., 0]seleciona o índice 0 no último eixo, todos os eixos anteriores completos.- Útil para arrays N-D sem listar cada dois pontos.
Como empilhar vs concatenar?
np.stackadiciona um novo eixo;np.concatenatejunta ao longo de um eixo existente.np.vstack/hstacksão wrappers de conveniência.
x[i, j] é o mesmo que x[(i, j)]?
- Sim para ndarray - o índice de tupla lista as dimensões.
x[i][j]indexa duas vezes e pode falhar em estruturas não quadradas.
Relacionados
- Arrays NumPy - criação, dtypes, broadcasting
- pandas Series & DataFrames - análogos de
.loc/.iloc - Desempenho e Memória - views vs cópias em escala
- Noções Básicas de Análise de Dados - exemplos introdutórios
Versões do Stack: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, e uv 0.6+.