NumPy: Indexação e Fatiamento
Última atualização: 2026-08-26
1. O que Você Aprenderá
- ❶ Indexação e fatiamento 1D: acesso por subscrito e extração de intervalos de arrays 1D
- ❷ Indexação 2D: extraindo linhas, colunas e sub-matrizes
- ❸ Intuição de indexação 3D: pensando em camadas para arrays de dimensões superiores
- ❹ Fatiamento com passo: passos positivos, passos negativos e índices negativos
- ❺ Fatias são views: entendendo a diferença essencial entre views e cópias
2. História
Charlie está analisando uma matriz de dados de sensores com 10K linhas. Ele usa data[0:3] para pegar as primeiras 3 linhas para limpeza de outliers, e define valores ausentes como -1:
subset = data[0:3]
subset[subset == -999] = -1
> **Saída:** Execute NumPy 2.x no seu ambiente Python local para ver a saída do ndarray. O servidor Piston não tem NumPy pré-instalado — instale localmente (`pip install numpy`) e compare. Os valores reais podem variar conforme a versão do NumPy e a semente aleatória.
Após a limpeza, subset parece ótimo. Mas quando ele verifica os data originais, as primeiras 3 linhas também foram modificadas!
"Fatias retornam views, não cópias!" Alice explica.
Ela mostra a Charlie como usar subset = data[0:3].copy() para operações seguras que não afetam o original. Charlie aprende da forma difícil: fatias NumPy compartilham memória por padrão — esta é a fonte de sua eficiência e a raiz de suas armadilhas.
3. Conceitos-Chave
(1) Indexação Básica
Indexação de array 1D funciona como listas Python: começa em 0, índices negativos contam a partir de -1.
import numpy as np
a = np.array([10, 20, 30, 40, 50])
a[0] # 10
a[-1] # 50
a[2] # 30
> **Saída:** Execute NumPy 2.x no seu ambiente Python local para ver a saída do ndarray. O servidor Piston não tem NumPy pré-instalado — instale localmente (`pip install numpy`) e compare. Os valores reais podem variar conforme a versão do NumPy e a semente aleatória.
(2) Sintaxe de Fatiamento
Formato de fatia: start:stop:step. Todas as três partes são opcionais:
| Forma curta | Equivalente | Significado |
|---|---|---|
a[:] |
a[0:len(a):1] |
Todos os elementos |
a[2:] |
a[2:len(a):1] |
Do índice 2 até o final |
a[:3] |
a[0:3:1] |
Primeiros 3 elementos |
a[::2] |
a[0:len(a):2] |
Elementos alternados |
a[::-1] |
a[len(a)-1::-1] |
Inverter o array |
a = np.arange(10) # [0 1 2 3 4 5 6 7 8 9]
a[2:7] # [2 3 4 5 6]
a[::3] # [0 3 6 9]
a[::-1] # [9 8 7 6 5 4 3 2 1 0]
> **Saída:** Execute NumPy 2.x no seu ambiente Python local para ver a saída do ndarray. O servidor Piston não tem NumPy pré-instalado — instale localmente (`pip install numpy`) e compare. Os valores reais podem variar conforme a versão do NumPy e a semente aleatória.
(3) Indexação 2D
import numpy as np
a = np.arange(12).reshape(3, 4)
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
# Linha e coluna
print(a[1]) # [4 5 6 7] — linha 1
print(a[1, 2]) # 6 — linha 1, coluna 2
# Sub-matriz
print(a[:2, 1:3])
# [[1 2]
# [5 6]]
> **Saída:** Execute NumPy 2.x no seu ambiente Python local para ver a saída do ndarray. O servidor Piston não tem NumPy pré-instalado — instale localmente (`pip install numpy`) e compare. Os valores reais podem variar conforme a versão do NumPy e a semente aleatória.
(4) Intuição de Indexação 3D
Pense em um array 3D como "camadas de matrizes 2D":
import numpy as np
a = np.arange(24).reshape(2, 3, 4)
print(a.shape) # (2, 3, 4)
# Camada 0: primeira matriz 3x4
print(a[0])
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
# Camada 1: segunda matriz 3x4
print(a[1])
# [[12 13 14 15]
# [16 17 18 19]
# [20 21 22 23]]
# Elemento único: a[camada, linha, coluna]
print(a[1, 2, 3]) # 23
> **Saída:** Execute NumPy 2.x no seu ambiente Python local para ver a saída do ndarray. O servidor Piston não tem NumPy pré-instalado — instale localmente (`pip install numpy`) e compare. Os valores reais podem variar conforme a versão do NumPy e a semente aleatória.
(5) Views vs Cópias
Fatias sempre retornam views. Modificar uma fatia modifica o array original.
import numpy as np
a = np.arange(12).reshape(3, 4)
view = a[0:2, 1:3]
view[0, 0] = 999
print(a)
# [[ 0 999 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
# O original mudou!
# Use .copy() para uma cópia segura
copy = a[0:2, 1:3].copy()
copy[0, 0] = 0
print(a[0, 1]) # 999 — original inalterado pela cópia
> **Saída:** Execute NumPy 2.x no seu ambiente Python local para ver a saída do ndarray. O servidor Piston não tem NumPy pré-instalado — instale localmente (`pip install numpy`) e compare. Os valores reais podem variar conforme a versão do NumPy e a semente aleatória.
▶ Exemplo
> **Saída:** Execute NumPy 2.x no seu ambiente Python local para ver a saída do ndarray. O servidor Piston não tem NumPy pré-instalado — instale localmente (`pip install numpy`) e compare. Os valores reais podem variar conforme a versão do NumPy e a semente aleatória.
: Fatiamento 1D com passo (Dificuldade ⭐)
import numpy as np
a = np.arange(10)
print("Original:", a)
# [0 1 2 3 4 5 6 7 8 9]
print("a[2:8:2]:", a[2:8:2]) # [2 4 6]
print("a[::-1]:", a[::-1]) # [9 8 7 6 5 4 3 2 1 0]
print("a[5:1:-1]:", a[5:1:-1]) # [5 4 3 2]
> **Saída:** Execute NumPy 2.x no seu ambiente Python local para ver a saída do ndarray. O servidor Piston não tem NumPy pré-instalado — instale localmente (`pip install numpy`) e compare. Os valores reais podem variar conforme a versão do NumPy e a semente aleatória.
▶ Exemplo
> **Saída:** Execute NumPy 2.x no seu ambiente Python local para ver a saída do ndarray. O servidor Piston não tem NumPy pré-instalado — instale localmente (`pip install numpy`) e compare. Os valores reais podem variar conforme a versão do NumPy e a semente aleatória.
: Extração de sub-matriz 2D (Dificuldade ⭐⭐)
import numpy as np
a = np.arange(20).reshape(4, 5)
print("Original:\n", a)
# Extrair linhas 1-2, colunas 2-4
sub = a[1:3, 2:5]
print("a[1:3, 2:5]:\n", sub)
# [[ 7 8 9]
# [12 13 14]]
# Linhas alternadas, colunas alternadas
print("a[::2, ::2]:\n", a[::2, ::2])
# [[ 0 2 4]
# [10 12 14]]
> **Saída:** Execute NumPy 2.x no seu ambiente Python local para ver a saída do ndarray. O servidor Piston não tem NumPy pré-instalado — instale localmente (`pip install numpy`) e compare. Os valores reais podem variar conforme a versão do NumPy e a semente aleatória.
4. Tabelas Comparativas
(1) Variantes de Fatiamento
| Fatia | Significado | Resultado para [0,1,2,3,4,5] |
|---|---|---|
[:] |
Todos | [0 1 2 3 4 5] |
[2:] |
Do índice 2 | [2 3 4 5] |
[:3] |
Primeiros 3 | [0 1 2] |
[1:4] |
Índice 1 a 3 | [1 2 3] |
[::2] |
Alternados | [0 2 4] |
[::-1] |
Invertido | [5 4 3 2 1 0] |
(2) View vs Cópia
| Característica | Fatia (View) | Indexação Fancy (Cópia) |
|---|---|---|
| Sintaxe | a[1:3] |
a[[1, 2, 3]] |
| Retorna | View | Cópia |
| Memória | Compartilhada | Nova alocação |
| Modificar afeta original | Sim | Não |
| Velocidade | O(1) | O(n) |
▶ Exemplo: Usando ellipsis para fatiamento multidimensional (Dificuldade ⭐⭐)
import numpy as np
arr = np.arange(24).reshape(2, 3, 4)
print("Shape:", arr.shape)
# Ellipsis (...) significa "todas as dimensões restantes"
print("arr[0, ...]:\n", arr[0, ...])
print("arr[..., 0]:\n", arr[..., 0])
# Selecionar a última coluna de todas as camadas e linhas
print("arr[..., -1]:\n", arr[..., -1])
Saída:
TEXT 📖 Somente leituraShape: (2, 3, 4) arr[0, ...]: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] arr[..., 0]: [[ 0 4 8] [12 16 20]] arr[..., -1]: [[ 3 7 11] [15 19 23]]
❓ Perguntas Frequentes
P: Como obtenho uma cópia em vez de uma view? R: Use
.copy()explicitamente:a[1:3].copy(). Ou use indexação fancy comoa[[0, 1, 2]]que sempre retorna uma cópia.
P: O que é o ellipsis (...) na indexação? R:
...(Ellipsis) significa "todas as dimensões restantes".a[..., 0]significa "selecionar índice 0 da última dimensão para todas as outras dimensões". Útil para arrays de alta dimensionalidade.
P: Posso atribuir valores a uma fatia? R: Sim!
a[1:3] = [99, 100]substitui os elementos 1 e 2. Este é um recurso poderoso — você pode modificar partes de um array in-place.
P: Por que a[::-1] inverte o array? R: Porque step=-1 significa "começar do final e ir para trás". É uma view, não uma cópia — então inverter é O(1) e não aloca nova memória.
📖 Resumo
- Indexação básica:
a[i]acessa o elemento i; índices negativos contam do final - Sintaxe de fatiamento:
start:stop:step— todas as partes opcionais, passo negativo inverte a direção - Indexação 2D:
a[linha, coluna]— misture fatias e inteiros livremente - Indexação 3D+: pense em camadas;
a[camada, linha, coluna]para 3D - Fatias retornam views — modificá-las muda o array original
- Use
.copy()para obter uma cópia segura e independente
📝 Exercícios
-
Básico (Dificuldade ⭐): Crie
a = np.arange(15). Extraia: (a) primeiros 5 elementos, (b) últimos 3 elementos, (c) elementos em índices pares, (d) o array em ordem reversa. -
Intermediário (Dificuldade ⭐⭐): Crie um array 5x5 de 0..24. Extraia: (a) a sub-matriz central 3x3, (b) a primeira e última linhas, (c) todas as linhas pares e colunas ímpares. Verifique que modificar a sub-matriz muda o original.
-
Desafio (Dificuldade ⭐⭐⭐): Crie um array 3x4x5. Use
...para selecionar a última coluna de todas as camadas e linhas. Depois usea[0, ...]para selecionar a primeira camada. Explique o que...faz em cada caso.