NumPy: Indexação e Fatiamento

Última atualização: 2026-08-26

1. O que Você Aprenderá



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:

PYTHON
subset = data[0:3]
subset[subset == -999] = -1
TEXT 📖 Somente leitura
> **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.

PYTHON
import numpy as np

a = np.array([10, 20, 30, 40, 50])
a[0]    # 10
a[-1]   # 50
a[2]    # 30
TEXT 📖 Somente leitura
> **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
⚠️ Nota: O código abaixo precisa ser executado em um ambiente Python local.

PYTHON
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]
TEXT 📖 Somente leitura
> **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

PYTHON
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]]
TEXT 📖 Somente leitura
> **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.
⚠️ Nota: O código abaixo precisa ser executado em um ambiente Python local.

(4) Intuição de Indexação 3D

Pense em um array 3D como "camadas de matrizes 2D":

PYTHON
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
TEXT 📖 Somente leitura
> **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.
⚠️ Nota: O código abaixo precisa ser executado em um ambiente Python local.

(5) Views vs Cópias

Fatias sempre retornam views. Modificar uma fatia modifica o array original.

PYTHON
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
TEXT 📖 Somente leitura
> **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.
⚠️ Nota: O código abaixo precisa ser executado em um ambiente Python local.


▶ Exemplo

TEXT 📖 Somente leitura
> **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 ⭐)

PYTHON
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]
TEXT 📖 Somente leitura
> **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.
⚠️ Nota: O código abaixo precisa ser executado em um ambiente Python local.

▶ Exemplo

TEXT 📖 Somente leitura
> **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 ⭐⭐)

PYTHON
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]]
TEXT 📖 Somente leitura
> **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.
⚠️ Nota: O código abaixo precisa ser executado em um ambiente Python local.



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 ⭐⭐)

PYTHON
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 leitura
Shape: (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 como a[[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



📝 Exercícios

  1. 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.

  2. 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.

  3. Desafio (Dificuldade ⭐⭐⭐): Crie um array 3x4x5. Use ... para selecionar a última coluna de todas as camadas e linhas. Depois use a[0, ...] para selecionar a primeira camada. Explique o que ... faz em cada caso.

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%