HOWTO · NumPy

Divisão elemento a elemento em Python NumPy

Existem dois métodos principais que podem ser usados para realizar uma divisão por elemento em arrays NumPy em Python, a função numpy.divide() e o operador /.

Nesta página

Para dividir valores correspondentes em arrays NumPy, use numpy.divide(x1, x2) ou x1 / x2. Ambos realizam divisão verdadeira elemento a elemento e retornam um array; use a forma de função quando argumentos opcionais, como out ou where, ajudarem a controlar o resultado.

Usando numpy.divide()

numpy.divide() recebe primeiro o dividendo e depois o divisor. Em arrays com formas iguais, cada valor do primeiro array é dividido pelo valor na mesma posição do segundo. Atribua o array retornado a uma variável se precisar usá-lo depois. O argumento out é opcional: omita-o para que o NumPy crie e retorne um resultado, ou passe um array existente com forma e tipo de dados compatíveis para armazenar nele os resultados.

Execute este exemplo:

O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.

import numpy as np

numerators = np.array([12, 18, 24])
denominators = np.array([3, 6, 8])
by_function = np.divide(numerators, denominators)
destination = np.array([0.0, 0.0, 0.0])
np.divide(numerators, denominators, out=destination)
by_operator = numerators / denominators
print(by_function)
print(by_operator)
print(destination)
[4. 3. 3.]
[4. 3. 3.]
[4. 3. 3.]

A primeira chamada da função omite out e retorna um array recém-criado. A segunda chamada grava os resultados em destination, criado com a forma e o tipo de dados do resultado. O operador usa as mesmas entradas, portanto os três arrays contêm os mesmos quocientes. As entradas são números inteiros, enquanto a divisão verdadeira produz valores de ponto flutuante.

Usando o operador /

Na maioria das expressões, / é a forma mais curta e clara de dividir arrays NumPy elemento a elemento. Escreva result = numerators / denominators; os operandos são avaliados posição por posição, e o array resultante pode ser atribuído, indexado ou passado para outra operação do NumPy. O NumPy aplica suas regras de aritmética de arrays quando um operando é escalar ou quando os dois arrays têm formas compatíveis.

O operador não é uma operação separada de divisão inteira: com arrays de inteiros, / realiza divisão verdadeira, e os valores dos quocientes são representados como ponto flutuante. Isso difere de // em Python, que solicita divisão arredondada para baixo. Escolha o operador conforme a operação desejada e não use // quando precisar de quocientes fracionários.

Broadcasting, tipos de dados e divisores iguais a zero

Arrays com a mesma forma dividem diretamente os elementos correspondentes. O NumPy também aplica broadcasting a formas compatíveis: as dimensões são comparadas da direita para a esquerda, e cada par de dimensões deve ser igual ou uma delas deve ser 1. Por exemplo, um array bidimensional com forma (2, 3) pode ser dividido por um array unidimensional com forma (3,), aplicando cada divisor a uma linha. Formas que não atendem à regra de broadcasting não podem ser divididas elemento a elemento; se houver incompatibilidade, inspecione array.shape nos dois operandos.

O tipo de dados resultante depende dos tipos das entradas e da operação de divisão. Em particular, entradas inteiras em / ou numpy.divide() produzem resultados de divisão verdadeira, sem truncar cada quociente para um número inteiro. Se uma etapa posterior exigir um tipo de dados específico, faça a conversão deliberadamente após a divisão e considere se ela descartará informações fracionárias.

Na divisão verdadeira, tanto / quanto numpy.divide() produzem resultados de ponto flutuante a partir de entradas inteiras. Assim, um divisor igual a zero pode produzir infinito quando o numerador é diferente de zero, ou nan em 0 / 0, acompanhado de um aviso durante a execução, assim como pode ocorrer com entradas de ponto flutuante. Este artigo aborda essas formas de divisão verdadeira; a divisão arredondada para baixo com // é uma operação diferente e não segue esse comportamento. Se for necessário excluir as posições cujo divisor é zero, inicialize primeiro um array de saída e use numpy.divide(a, b, out=result, where=b != 0); as posições em que a condição é falsa mantêm os valores inicializados. Escolha um valor de preenchimento adequado ao cálculo posterior e decida separadamente como tratar as posições excluídas.

Como escolher um método de divisão

Use / em uma expressão direta quando quiser um quociente conciso, calculado elemento a elemento. Use numpy.divide() quando os argumentos da função forem úteis, especialmente out para gravar em um array de destino existente ou where para selecionar quais posições calcular. Em qualquer forma, confirme que os operandos têm formas compatíveis e decida como tratar divisores iguais a zero considerando os tipos de dados usados. Essas verificações facilitam a adaptação do código a vetores, matrizes e entradas compatíveis com broadcasting.