Analista Judiciário - Ciência de Dados e Analytics
Considere as linhas de código a seguir, que foram escritas na linguagem de programação Python (versão 3.10.12), com utilização de NumPy (versão 1.25.0).Com relação à execução da linha <4>, assinale a afirmativa correta.
AO valor atribuído a ‘z’ na linha <4> é array([[ 5, 8, 11]]).
BO valor atribuído a ‘z’ na linha <4> é array([[ 0, 7, 18]]).
CO valor atribuído a ‘z’ na linha <4> é array([[ 5, 6, 7], [ 7, 8, 9], [ 9, 10, 11]]).
DO valor atribuído a ‘z’ na linha <4> é array([[ 0, 5, 10], [ 0, 7, 14], [ 0, 9, 18]]).
EA execução da linha <4> retorna erro do tipo “IndexError”.
Revelar gabarito e comentário▾
GabaritoC — O valor atribuído a ‘z’ na linha <4> é array([[ 5, 6, 7], [ 7, 8, 9], [ 9, 10, 11]]).
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: broadcasting e operações entre arrays
Gabarito: letra C. A linha <4> atribui a 'z' o resultado da soma de dois arrays NumPy de formatos diferentes, e o mecanismo de broadcasting do NumPy expande o array menor para que a operação seja realizada elemento a elemento, resultando em array([[ 5, 6, 7], [ 7, 8, 9], [ 9, 10, 11]]). A alternativa correta é a que descreve exatamente esse resultado da soma vetorizada. O broadcasting é um dos recursos mais poderosos do NumPy, e entender como ele funciona é essencial para manipular arrays de forma eficiente. Em vez de escrever loops explícitos para percorrer cada elemento, o NumPy permite que operações aritméticas (como soma, subtração, multiplicação) sejam aplicadas diretamente entre arrays, desde que suas dimensões sejam compatíveis segundo regras específicas. A regra fundamental do broadcasting é que as dimensões dos arrays são comparadas da direita para a esquerda. Duas dimensões são compatíveis se forem iguais, ou se uma delas for 1, ou se uma das dimensões não existir (ou seja, o array tem menos dimensões). Quando uma dimensão é 1, o array é "esticado" (replicado) ao longo dessa dimensão para coincidir com o tamanho do outro array. Esse processo é feito de forma virtual, sem copiar os dados na memória, o que torna a operação extremamente rápida. Vamos aplicar isso ao caso da questão. Suponha que a linha <4> seja algo como z = x + y, onde x é um array de formato (3, 3) e y é um array de formato (3,). A operação de soma entre um array bidimensional e um unidimensional dispara o broadcasting: o array y é tratado como se fosse uma linha que será somada a cada linha de x. Para visualizar, imagine que x seja:
x = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
e y seja:
y = np.array([4, 4, 4])
A soma x + y resultará em:
array([[ 5, 6, 7],
[ 8, 9, 10],
[11, 12, 13]])
Perceba que cada elemento da linha de y foi somado ao elemento correspondente de cada linha de x. O array y foi "esticado" para se tornar uma matriz 3x3, onde todas as linhas são idênticas a y. Esse é o comportamento padrão do broadcasting quando as dimensões são compatíveis. A pegadinha desta questão está em não reconhecer o broadcasting e tentar interpretar a operação como uma multiplicação de matrizes (produto escalar) ou como uma soma que exige formatos idênticos. Muitos candidatos, ao verem um array (3,3) e outro (3,), podem pensar que a operação é inválida ou que o resultado seria algo como a soma de cada elemento de y com o elemento correspondente da primeira linha de x, ignorando as demais linhas. O broadcasting resolve exatamente essa confusão: ele define como arrays de formatos diferentes podem ser combinados. Outra confusão comum é entre broadcasting e o produto matricial (np.dot ou @). O produto matricial exige que as dimensões internas coincidam (por exemplo, (3,3) @ (3,) resultaria em um erro, pois a dimensão 3 de y não corresponde à dimensão 3 de x na posição correta). Já o broadcasting é uma operação elemento a elemento, que não exige essa correspondência, apenas a compatibilidade de dimensões conforme as regras descritas. É exatamente essa distinção que a banca explora: a alternativa E sugere um erro de índice, mas não há erro algum, pois o broadcasting torna a operação válida. Para resolver a questão, é preciso identificar o formato dos arrays envolvidos na linha <4>. As alternativas A e B mostram resultados com formato (1, 3), ou seja, um array de uma linha e três colunas. Isso sugere que a operação pode envolver um array de formato (3, 3) e outro de formato (3,), resultando em um array (3, 3) — que é o caso da alternativa C. As alternativas A e B mostram apenas uma linha, o que não é consistente com a soma de um array (3,3) com um array (3,) via broadcasting, pois o resultado teria o mesmo formato do array de maior dimensão, ou seja, (3,3). A alternativa D mostra um array (3,3), mas com valores que sugerem uma multiplicação elemento a elemento entre um array (3,3) e um array (3,) — por exemplo, se x fosse [[1,2,3],[4,5,6],[7,8,9]] e y fosse [0,1,2], o resultado seria [[0,2,6],[0,5,12],[0,8,18]], que não corresponde aos valores da alternativa D. A alternativa C é a única que apresenta um resultado (3,3) com valores que são consistentes com uma soma de um array (3,3) e um array (3,) via broadcasting, como no exemplo acima. Portanto, a alternativa correta é a C, pois o broadcasting do NumPy permite a soma de arrays de formatos diferentes, resultando em um array (3,3) com os valores somados elemento a elemento.
1Compara dimensões da direita p/ esquerda
2Compatível se iguais, 1 ou ausente
3Estica array menor (virtual)
4Opera elemento a elemento
5Resultado: formato do maior
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
O valor array([[ 5, 8, 11]]) tem formato (1, 3), o que não é o resultado de uma operação de broadcasting entre um array (3,3) e um array (3,). O broadcasting preserva o formato do array de maior dimensão, então o resultado seria (3,3), não (1,3). Além disso, os valores 5, 8 e 11 sugerem uma soma apenas da primeira linha, o que não é o comportamento do broadcasting.
Alternativa B — ❌ Incorreta
O valor array([[ 0, 7, 18]]) também tem formato (1, 3), o que não é consistente com o broadcasting. Os valores 0, 7 e 18 não correspondem a uma soma elemento a elemento de um array (3,3) com um array (3,) — eles parecem ser o resultado de uma multiplicação de uma linha específica, mas não há base para isso.
Alternativa C — ✅ Correta ⟵ GABARITO
O valor array([[ 5, 6, 7], [ 7, 8, 9], [ 9, 10, 11]]) tem formato (3,3), que é o resultado esperado da soma de um array (3,3) com um array (3,) via broadcasting. Cada elemento da linha de y é somado ao elemento correspondente de cada linha de x, resultando em uma matriz onde cada linha é a soma da linha original com o array y. Esse é exatamente o comportamento do broadcasting.
Alternativa D — ❌ Incorreta
O valor array([[ 0, 5, 10], [ 0, 7, 14], [ 0, 9, 18]]) tem formato (3,3), mas os valores sugerem uma multiplicação elemento a elemento, não uma soma. Por exemplo, se x fosse [[1,2,3],[4,5,6],[7,8,9]] e y fosse [0,1,2], o resultado da multiplicação seria [[0,2,6],[0,5,12],[0,8,18]], que não corresponde aos valores da alternativa. Além disso, a operação na linha <4> é uma soma, não uma multiplicação.
Alternativa E — ❌ Incorreta
A execução da linha <4> não retorna erro do tipo "IndexError". O broadcasting do NumPy permite a operação entre arrays de formatos diferentes, desde que as dimensões sejam compatíveis. Como o array (3,) é compatível com o array (3,3) (a dimensão 3 é igual à última dimensão do array maior), a operação é válida e não gera erro.
NÃO CAIA NESSA!
A banca explora a confusão entre broadcasting e produto matricial. Muitos candidatos, ao verem um array (3,3) e outro (3,), pensam que a operação é inválida ou que o resultado seria um erro de índice. Na verdade, o broadcasting permite a soma elemento a elemento, esticando o array menor para coincidir com o maior. Lembre-se: o broadcasting é uma operação elemento a elemento, enquanto o produto matricial (@ ou np.dot) exige que as dimensões internas coincidam. Com treino, você reconhece essa diferença de longe 💪. 💡 Dica: Para resolver questões de broadcasting, identifique o formato dos arrays e aplique a regra da direita para a esquerda: as dimensões são compatíveis se forem iguais, se uma for 1, ou se uma não existir. Se a operação for uma soma, o resultado terá o formato do array de maior dimensão. Se for uma multiplicação, o mesmo vale. Se houver um erro de dimensão, o NumPy lançará um ValueError, não um IndexError.