NumPy: Arrays Estruturados
Última atualização: 2026-08-26
1. O que Você Aprenderá
- ❶ Criando arrays estruturados com múltiplos dtypes
- ❷ Acessando campos por nome
- ❸ Record arrays para acesso estilo atributo
- ❹ Ordenando e filtrando arrays estruturados
2. Conceitos-Chave
import numpy as np
# Definir dtype estruturado
dt = np.dtype([('name', 'U10'), ('age', 'i4'), ('salary', 'f8')])
# Criar array
employees = np.array([
('Alice', 30, 75000.0),
('Bob', 25, 62000.0),
('Charlie', 35, 85000.0),
('Diana', 28, 71000.0)
], dtype=dt)
# Acessar campos
print(employees['name']) # ['Alice' 'Bob' 'Charlie' 'Diana']
print(employees['salary']) # [75000. 62000. 85000. 71000.]
# Record array (acesso por atributo)
emp_rec = np.rec.array(employees)
print(emp_rec.name) # ['Alice' 'Bob' 'Charlie' 'Diana']
print(emp_rec.salary) # [75000. 62000. 85000. 71000.]
# Filtragem
print(employees[employees['salary'] > 70000]['name'])
# ['Alice' 'Charlie']
# Ordenação
sorted_emp = np.sort(employees, order='salary')
print(sorted_emp['name']) # ['Bob' 'Diana' 'Alice' 'Charlie']
> **Output:** Execute o NumPy 2.x em seu ambiente Python local para ver a saída do ndarray. O servidor Piston não tem o NumPy pré-instalado — instale-o localmente (`pip install numpy`) e compare. Os valores reais podem variar conforme a versão do NumPy e a semente aleatória.
▶ Exemplo: Criando e acessando arrays estruturados (Dificuldade ⭐)
import numpy as np
dt = np.dtype([('product', 'U15'), ('price', 'f8'), ('quantity', 'i4')])
inventory = np.array([
('Widget', 9.99, 100),
('Gadget', 24.99, 50),
('Doohickey', 4.99, 200),
('Thingamajig', 14.99, 75)
], dtype=dt)
print("Produtos:", inventory['product'])
print("Preços:", inventory['price'])
print("Valor total:", np.sum(inventory['price'] * inventory['quantity']))
Output:
TEXT 📖 Somente leituraProdutos: ['Widget' 'Gadget' 'Doohickey' 'Thingamajig'] Preços: [ 9.99 24.99 4.99 14.99] Valor total: 4396.0
▶ Exemplo: Filtrando arrays estruturados (Dificuldade ⭐⭐)
import numpy as np
dt = np.dtype([('name', 'U15'), ('age', 'i4'), ('salary', 'f8')])
employees = np.array([
('Alice', 30, 75000), ('Bob', 25, 62000),
('Charlie', 35, 85000), ('Diana', 28, 71000),
('Eve', 45, 95000), ('Frank', 32, 78000)
], dtype=dt)
# Filtrar: salário > 70000 E idade < 40
mask = (employees['salary'] > 70000) & (employees['age'] < 40)
filtered = employees[mask]
print("Filtrados:", filtered['name'])
# Salário médio por faixa etária
young = employees[employees['age'] < 30]
print("Salário médio jovens:", young['salary'].mean())
Output:
TEXT 📖 Somente leituraFiltrados: ['Alice' 'Charlie' 'Frank'] Salário médio jovens: 66500.0
▶ Exemplo: Ordenando arrays estruturados por campo (Dificuldade ⭐⭐)
import numpy as np
dt = np.dtype([('city', 'U15'), ('population', 'i4'), ('area', 'f8')])
cities = np.array([
('Tokyo', 13960000, 2194), ('Delhi', 16780000, 1484),
('Shanghai', 24870000, 6341), ('Mumbai', 12440000, 603),
('Beijing', 21540000, 16411)
], dtype=dt)
# Ordenar por população decrescente
by_pop = np.sort(cities, order='population')[::-1]
print("Por população:", by_pop['city'])
# Ordenar por densidade (população / área)
density = cities['population'] / cities['area']
dense_idx = np.argsort(-density)
print("Por densidade:", cities['city'][dense_idx])
Output:
TEXT 📖 Somente leituraPor população: ['Shanghai' 'Beijing' 'Delhi' 'Tokyo' 'Mumbai'] Por densidade: ['Mumbai' 'Delhi' 'Tokyo' 'Shanghai' 'Beijing']
P: Quando devo usar arrays estruturados vs Pandas? R: Use arrays estruturados quando precisa da velocidade e eficiência de memória do NumPy para operações homogêneas. Use Pandas para análise de dados mais complexa com rotulagem, agrupamento e tratamento de dados ausentes.
P: Posso adicionar campos a um array estruturado existente? R: Não — arrays estruturados têm um dtype fixo. Crie um novo dtype com os campos adicionais e copie os dados. Use
np.lib.recfunctions.append_fieldspor conveniência.
P: Qual é a diferença entre array estruturado e recarray? R: recarray (record array) permite acesso por atributo (
emp.name) além do acesso por campo (emp['name']). É ligeiramente mais lento, mas mais conveniente.
❓ Perguntas Frequentes
P: O que é a coisa mais importante a lembrar? R: As operações do NumPy são vetorizadas — evite loops Python para melhor desempenho.
P: Onde posso aprender mais? R: Consulte a documentação oficial do NumPy em numpy.org para referências detalhadas e tópicos avançados.
P: Isso funciona com o NumPy 2.x? R: Sim — todos os exemplos são compatíveis com o NumPy 2.x. Algumas APIs mais antigas (como np.random.seed) ainda são suportadas, mas as alternativas modernas são recomendadas.
📖 Resumo
- Arrays estruturados armazenam tipos mistos em um único ndarray usando dtypes compostos
- Acesse campos por nome:
arr['fieldname'] - Record arrays habilitam acesso estilo atributo:
arr.fieldname - Filtre e ordene por valores de campo usando máscaras booleanas e
np.sort - Para dados tabulares complexos, considere DataFrames do Pandas
📝 Exercícios
-
Básico (Dificuldade ⭐): Crie um array estruturado com campos: produto (U20), preço (f8), quantidade (i4). Adicione 5 produtos.
-
Intermediário (Dificuldade ⭐⭐): Do array de produtos, filtre itens com preço > 50 e quantidade < 10. Ordene por preço decrescente.
-
Desafio (Dificuldade ⭐⭐⭐): Use
np.lib.recfunctionspara adicionar um campo 'total_value' (preço × quantidade) ao array. Verifique o cálculo.