NumPy é a base computacional do Python para dados — Pandas, Scikit-learn e praticamente toda biblioteca científica é construída sobre ela. Arrays NumPy são mais rápidos que listas Python porque armazenam dados em blocos contíguos de memória de tipo fixo, permitindo operações vetorizadas sem loops.

Criando arrays

import numpy as np

# A partir de uma lista:
a = np.array([1, 2, 3, 4, 5])
print(a.dtype)   # int64
print(a.shape)   # (5,) — 1D com 5 elementos

# Funções de criação:
zeros = np.zeros(5)           # [0. 0. 0. 0. 0.]
uns = np.ones((3, 4))         # matriz 3x4 de 1s
seq = np.arange(0, 10, 2)    # [0, 2, 4, 6, 8]
lin = np.linspace(0, 1, 5)   # 5 valores igualmente espaçados entre 0 e 1
aleatorio = np.random.rand(3, 3)  # matriz 3x3 de valores aleatórios [0,1)

Operações vetorizadas: sem loop

precos = np.array([100, 200, 300, 400, 500])
qtd = np.array([10, 5, 8, 3, 12])

# Tudo calculado elemento a elemento, sem loop:
receita = precos * qtd          # [1000, 1000, 2400, 1200, 6000]
desconto = precos * 0.1         # aplica 10% em todos
precos_com_iva = precos * 1.12  # multiplica todo o array por 1.12

O mesmo cálculo com lista Python exigiria um loop for. NumPy executa em C puro — tipicamente 10-100x mais rápido.

Indexação e slicing

a = np.array([10, 20, 30, 40, 50])
print(a[0])      # 10
print(a[-1])     # 50
print(a[1:4])    # [20, 30, 40]
print(a[::2])    # [10, 30, 50] (a cada 2)

# Matriz 2D:
m = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(m[0])      # primeira linha: [1, 2, 3]
print(m[:,1])    # segunda coluna: [2, 5, 8]
print(m[1,2])    # linha 1, coluna 2: 6

Filtros booleanos

vendas = np.array([1200, 450, 8900, 320, 5600])
mask = vendas > 1000
print(mask)           # [True False True False True]
print(vendas[mask])   # [1200, 8900, 5600]
print(vendas[vendas > 1000])  # forma compacta

Funções matemáticas

dados = np.array([4, 7, 2, 9, 1, 5, 8])

print(np.sum(dados))     # 36
print(np.mean(dados))    # 5.14
print(np.std(dados))     # desvio padrão
print(np.median(dados))  # 5.0
print(np.max(dados))     # 9
print(np.min(dados))     # 1
print(np.sort(dados))    # [1, 2, 4, 5, 7, 8, 9]
print(np.cumsum(dados))  # soma acumulada

Reshape: mudando a forma do array

a = np.arange(12)
m = a.reshape(3, 4)  # 3 linhas x 4 colunas
print(m.shape)       # (3, 4)
print(m.T)           # transposta: 4 linhas x 3 colunas

Perguntas frequentes

Quando usar NumPy vs Pandas?

NumPy é ideal para arrays numéricos homogêneos e cálculo matemático puro. Pandas é melhor para dados tabulares heterogêneos (colunas com tipos diferentes), com rótulos de coluna, datas e operações de grupos. Pandas usa NumPy internamente.

np.nan: como lidar com valores nulos em arrays NumPy?

Use np.nan para representar nulos em arrays float. Funções como np.nanmean(), np.nansum() ignoram NaN automaticamente. Arrays de inteiros não suportam NaN — converta para float primeiro.