Pular para o conteúdo
</>RoByte

Buscar cursos e aulas

Aulas do curso

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.