Vídeo em breve
Por enquanto, esta aula está disponível só em texto — o vídeo entra assim que ficar pronto.
Fundamentos
NumPy: arrays e operações vetorizadas
A biblioteca por baixo de quase todo o ecossistema de ML: criar arrays, fazer contas em bloco, indexar e calcular estatísticas. · 16 min
Os modelos de ML trabalham com grandes tabelas de números. O NumPy é a
biblioteca que torna isso rápido: ela guarda os números em arrays e faz
contas em todos os elementos de uma vez, sem precisar de um for.
import numpy as np
Criando arrays
a = np.array([1, 2, 3, 4])
zeros = np.zeros(5) # [0. 0. 0. 0. 0.]
uns = np.ones((2, 3)) # matriz 2x3 só com 1
sequencia = np.arange(0, 10, 2) # [0 2 4 6 8], igual ao range()
espacado = np.linspace(0, 1, 5) # 5 pontos igualmente espaçados de 0 a 1
Todo array tem atributos úteis: a.shape (as dimensões), a.dtype (o tipo
dos números) e a.ndim (o número de dimensões).
Operações vetorizadas
Aqui está a grande vantagem sobre listas comuns:
lista = [1, 2, 3]
print(lista * 2) # [1, 2, 3, 1, 2, 3] (repete a lista)
a = np.array([1, 2, 3])
print(a * 2) # [2 4 6] (multiplica cada elemento)
print(a + a) # [2 4 6]
print(a ** 2) # [1 4 9]
print(a > 1) # [False True True]
Sem escrever nenhum laço, a operação vale para o array inteiro. Além de mais curto, isso é muito mais rápido em arrays grandes.
Indexação, fatiamento e máscaras booleanas
notas = np.array([4.5, 7.0, 9.2, 5.8, 8.1])
print(notas[0]) # 4.5
print(notas[1:3]) # [7. 9.2]
print(notas[notas >= 6]) # [7. 9.2 8.1], filtra com uma condição
O último exemplo se chama máscara booleana: a condição gera um array de
True e False, e o NumPy devolve só os elementos onde deu True. Você
vai usar isso o tempo todo para filtrar dados.
Matrizes e o parâmetro axis
Uma tabela de dados é uma matriz: linhas são amostras e colunas são features.
m = np.array([[1, 2, 3],
[4, 5, 6]])
print(m.shape) # (2, 3): 2 linhas e 3 colunas
print(m[0, 1]) # 2 (linha 0, coluna 1)
print(m.mean(axis=0)) # [2.5 3.5 4.5], média de cada coluna
print(m.mean(axis=1)) # [2. 5.], média de cada linha
Dica
Para lembrar do axis: axis=0 “colapsa” as linhas e devolve um
resultado por coluna. axis=1 colapsa as colunas e devolve um resultado
por linha.
reshape reorganiza as dimensões sem mudar os dados:
x = np.arange(6).reshape(2, 3)
# [[0 1 2]
# [3 4 5]]
Estatísticas básicas
dados = np.array([10, 20, 30, 40, 50])
print(dados.mean()) # 30.0 (média)
print(dados.std()) # desvio padrão
print(dados.min(), dados.max())
print(dados.sum()) # 150
Atenção
O scikit-learn espera que as features estejam numa matriz 2D, com formato
(n_amostras, n_features). Um array 1D com 100 valores precisa virar
(100, 1) com reshape(-1, 1). Esquecer isso gera o erro “Expected 2D
array, got 1D array”, que você vai ver mais de uma vez.
Exercícios
Exercício
1. Aquecimento. Crie um array com os números de 1 a 10 usando
np.arange e imprima o array dos quadrados de cada um, sem usar for.
Exercício
2. Filtrando. Dado notas = np.array([4.5, 7.0, 9.2, 5.8, 8.1, 6.4]),
imprima a média, quantas notas estão acima da média e a lista das notas
reprovadas (menores que 6).
Exercício
3. Desafio. Escreva uma função normalizar(x) que recebe um array e
devolve os valores reescalados entre 0 e 1, com a fórmula
(x - x.min()) / (x.max() - x.min()). Essa técnica se chama
normalização min-max e é muito usada para preparar features antes de
treinar um modelo.