Tecnologista Pleno I - Previsão Imediata (Nowcasting); Desenvolvimento de Produtos Meteorológicos ou Ambientais, Métodos e Ferramentas para a Implantação de Sistemas para Previsão Imediata
Considere o trecho de código dado abaixo escrito na linguagem de programação Python, com uso da biblioteca para computação científica NumPy.Com relação ao trecho acima, analise os itens a seguir:I. O comando abaixo retorna o valor ('Morango', 25, 18.3).>>> x[0]II. O comando abaixo retorna o valor 2.5.>>> x[x['codigo']>30]['valor']III. O comando abaixo altera o campo “nome” do último elemento do array.>>> x['nome'][:]=' Laranja'Está correto o que se afirma em:
AI, apenas.
BII, apenas.
CI e II, apenas.
DI e III, apenas.
EI, II e III.
Revelar gabarito e comentário▾
GabaritoA — I, apenas.
Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.
NumPy: arrays estruturados e indexação
Gabarito: letra A. Apenas o item I está correto: x[0] retorna a primeira linha do array estruturado, ou seja, a tupla ('Morango', 25, 18.3). O item II está incorreto porque x[x['codigo']>30]['valor'] retorna um array com todos os valores cujo código é maior que 30, e não um único valor escalar. O item III está incorreto porque a atribuição x['nome'][:]=' Laranja' tenta atribuir uma string a um array de strings, o que gera um erro de broadcasting, e não altera apenas o último elemento.
O NumPy é uma biblioteca fundamental para computação científica em Python, e uma de suas funcionalidades mais poderosas é o array estruturado (structured array). Diferente de um array comum, que armazena elementos homogêneos, um array estruturado permite armazenar diferentes tipos de dados em cada coluna, funcionando de forma análoga a uma tabela de banco de dados. Cada linha do array é um registro, e cada coluna é um campo com um nome e um tipo específico.
Para criar um array estruturado, utilizamos o parâmetro dtype da função np.array(), especificando uma lista de tuplas, onde cada tupla define o nome do campo e o tipo de dado. Por exemplo, np.array([('Morango', 25, 18.3), ('Banana', 40, 5.5)], dtype=[('nome', 'U10'), ('codigo', 'i4'), ('valor', 'f8')]) cria um array com três campos: nome (string de até 10 caracteres), codigo (inteiro de 4 bytes) e valor (float de 8 bytes).
A indexação em arrays estruturados é dupla: podemos indexar por posição (linha) e por campo (coluna). x[0] retorna a primeira linha como uma tupla nomeada, x['codigo'] retorna um array com todos os valores da coluna codigo, e x[x['codigo']>30] aplica uma máscara booleana, retornando apenas as linhas que satisfazem a condição. A combinação x[x['codigo']>30]['valor'] primeiro filtra as linhas e depois seleciona a coluna valor, resultando em um array com todos os valores correspondentes.
A atribuição em arrays estruturados também é dupla. Para alterar um campo específico de uma linha, usamos x['nome'][indice] = 'novo_valor'. No entanto, a sintaxe x['nome'][:] = ' Laranja' tenta atribuir uma string a todas as posições do array x['nome']. O NumPy tenta fazer um broadcasting, ou seja, espalhar o valor para todos os elementos. Como o array x['nome'] é do tipo string (U10), o valor ' Laranja' (com espaço) é convertido para uma string de 10 caracteres e atribuído a todas as linhas, não apenas à última. Além disso, se o array tiver mais de uma linha, essa operação não gera erro, mas altera todos os nomes, o que não é o que o item descreve. Se o array tiver apenas uma linha, a operação funcionaria, mas ainda assim alteraria o único elemento, não o "último" de forma específica.
A pegadinha central desta questão está na distinção entre indexação por posição e por campo, e na semântica do fatiamento com atribuição. O candidato que confunde x[0] (primeira linha) com x['nome'][0] (primeiro nome) erra o item I. O que confunde a filtragem com a seleção de um único valor erra o item II. E o que não percebe que [:] atribui a todos os elementos erra o item III. Vamos analisar cada item com precisão.
Item I — ✅ Correto
O comando x[0] retorna a primeira linha do array estruturado. Como o array foi criado com a primeira linha sendo ('Morango', 25, 18.3), o resultado é exatamente essa tupla. A indexação por posição em um array 1D retorna o elemento naquela posição, que, no caso de um array estruturado, é uma tupla nomeada com os valores de cada campo. Portanto, o item I está correto.
Item II — ❌ Incorreto
O comando x[x['codigo']>30]['valor'] primeiro cria uma máscara booleana x['codigo']>30, que seleciona as linhas onde o código é maior que 30. Em seguida, x[mascara] retorna um sub-array com essas linhas, e ['valor'] seleciona a coluna valor desse sub-array. O resultado é um array NumPy contendo todos os valores de valor das linhas filtradas, e não um único valor escalar. Por exemplo, se houver duas linhas com código > 30, o resultado será array([5.5, 7.2]), e não 2.5. Para obter um único valor, seria necessário indexar novamente, como x[x['codigo']>30]['valor'][0]. Portanto, o item II está incorreto.
Item III — ❌ Incorreto
O comando x['nome'][:]=' Laranja' tenta atribuir a string ' Laranja' a todas as posições do array x['nome']. O fatiamento [:] seleciona todos os elementos, e a atribuição com = tenta espalhar o valor para todos eles. Se o array tiver mais de uma linha, isso altera o campo nome de todas as linhas, não apenas da última. Se o array tiver apenas uma linha, altera o único elemento, mas não é uma operação que visa especificamente o último. Para alterar apenas o último elemento, o comando correto seria x['nome'][-1] = 'Laranja'. Portanto, o item III está incorreto.
NÃO CAIA NESSA!
A banca explora a confusão entre indexação por posição (x[0]) e indexação por campo (x['nome']), e entre selecionar um elemento (x[0]) e selecionar uma coluna inteira (x['valor']). No item II, o candidato pode pensar que x[x['codigo']>30]['valor'] retorna um único valor, mas na verdade retorna um array. No item III, a pegadinha é o uso de [:] na atribuição, que altera todos os elementos, não apenas o último. Fique atento: para alterar um único elemento, use o índice específico, como x['nome'][-1].
PEGA ESSA DICA!
Para resolver questões de arrays estruturados do NumPy, lembre-se da dupla indexação: primeiro a linha (posição), depois a coluna (campo). Quando houver uma máscara booleana, o resultado é sempre um array, nunca um escalar. E, ao atribuir valores, use índices específicos (x['campo'][i] = valor) em vez de fatiamento ([:]), a menos que queira alterar todos os elementos. Pratique com exemplos simples para fixar a semântica.