Pular para o conteúdo principal

Questão de Programação — Python — FGV 2024

ProgramaçãoPython
Código
fg086364
Banca
FGV
Órgão
INPE
Ano
2024
Nível
Superior
Cargo
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.Imagem associada para resolução da questãoCom 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:
  1. AI, apenas.
  2. BII, apenas.
  3. CI e II, apenas.
  4. DI e III, apenas.
  5. 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.

Gabarito: letra A — apenas o item I está correto.

Link permanente: /questoes/fg086364