HOWTO · NumPy

NumPy Fatorial

Aprenda a calcular o fatorial dos elementos de uma matriz NumPy usando a função special.factorial() do SciPy em Python, com exemplos de código e explicações dos resultados, incluindo por que os valores são retornados como números de ponto flutuante e como solicitar resultados inteiros exatos.

Nesta página

Calcular o fatorial de números é uma tarefa comum em matemática e programação, especialmente em campos como estatística e combinatória. Em Python, podemos calcular o fatorial dos elementos de uma matriz NumPy usando a função special.factorial() da biblioteca SciPy.

Esta função realiza o cálculo elemento a elemento sobre uma matriz. Quer você esteja trabalhando com um pequeno conjunto de números ou com uma matriz grande, a mesma chamada aplica o fatorial a cada elemento de uma só vez.

Neste artigo, exploraremos como usar a função special.factorial(), fornecendo exemplos claros e explicações para ajudá-lo a compreender este conceito essencial.

O que é um fatorial?

Antes de mergulhar no código, é crucial entender o que é um fatorial. O fatorial de um inteiro não negativo n, denotado como n!, é o produto de todos os inteiros positivos menores ou iguais a n. Por exemplo, 5! é igual a 5 × 4 × 3 × 2 × 1, que é igual a 120. Os fatoriais são amplamente utilizados em permutações, combinações e outros cálculos matemáticos.

Na programação, os fatoriais são frequentemente necessários para cada elemento de uma matriz de uma só vez. É aqui que NumPy e SciPy entram em jogo: special.factorial() aplica a operação elemento a elemento sobre uma matriz.

Usando a função special.factorial() do SciPy

A função special.factorial() da biblioteca SciPy foi projetada para calcular o fatorial de cada elemento de uma matriz. Ela realiza a operação elemento a elemento, portanto uma única chamada lida com uma matriz de qualquer tamanho.

Para usar esta função, você primeiro precisa instalar a biblioteca SciPy, caso ainda não o tenha feito. Você pode fazer isso usando o pip:

pip install scipy

Depois de instalar o SciPy, você pode começar a usar a função special.factorial(). Abaixo está um exemplo simples para demonstrar como calcular o fatorial de uma matriz de inteiros.

import numpy as np
from scipy import special

arr = np.array([0, 1, 2, 3, 4, 5])
factorials = special.factorial(arr)

print(factorials)

Output:

[  1.   1.   2.   6.  24. 120.]

Neste exemplo, primeiro importamos as bibliotecas necessárias: NumPy e o módulo special do SciPy. Criamos uma matriz NumPy contendo inteiros de 0 a 5. Ao passar esta matriz para a função special.factorial(), obtemos os fatoriais desses números. A saída mostra os respectivos fatoriais como números de ponto flutuante, que é o comportamento padrão da função.

Calculando fatoriais para matrizes grandes

A mesma chamada funciona inalterada para matrizes maiores.

Vamos ver um exemplo em que calculamos o fatorial para um intervalo maior de números.

large_arr = np.arange(10, 21)  # Array from 10 to 20
large_factorials = special.factorial(large_arr)

print(large_factorials)

Output:

[3.62880000e+06 3.99168000e+07 4.79001600e+08 6.22702080e+09
 8.71782912e+10 1.30767437e+12 2.09227899e+13 3.55687428e+14
 6.40237371e+15 1.21645100e+17 2.43290201e+18]

Neste caso, criamos uma matriz contendo inteiros de 10 a 20 usando np.arange(). A função special.factorial() calcula o fatorial de cada elemento desta matriz, sem a necessidade de escrever um loop. A saída é exibida em notação científica devido ao grande tamanho dos números.

Por que os resultados são números de ponto flutuante

Observe novamente as saídas acima: os fatoriais voltam como números de ponto flutuante — 120. em vez de 120, e os resultados maiores em notação científica. Esse é o comportamento padrão de special.factorial(): ela retorna seus resultados como valores de ponto flutuante, mesmo quando cada entrada é um inteiro.

Os números de ponto flutuante têm precisão limitada, portanto, para fatoriais muito grandes, o valor retornado é o número de ponto flutuante representável mais próximo, e não o inteiro exato. Se você precisar de resultados inteiros exatos, passe exact=True:

arr = np.array([0, 1, 2, 3, 4, 5])
exact_factorials = special.factorial(arr, exact=True)

print(exact_factorials)

Output:

[  1   1   2   6  24 120]

Com exact=True, as mesmas entradas retornam inteiros sem ponto decimal, como mostra a saída. Escolha a forma padrão quando resultados de ponto flutuante forem aceitáveis para o seu cálculo, e a forma exata quando o valor inteiro preciso for importante.

Conclusão

Em resumo, a função special.factorial() da biblioteca SciPy calcula fatoriais elemento a elemento sobre uma matriz NumPy em Python. Quer você esteja trabalhando com uma matriz pequena ou grande, a mesma chamada se aplica, e os resultados voltam como números de ponto flutuante por padrão, com resultados inteiros exatos disponíveis passando exact=True. Compreender como calcular fatoriais não apenas ajuda em cálculos matemáticos, mas também abre portas para tópicos mais avançados em estatística e ciência de dados.

FAQ

  1. Qual é o fatorial de um número?
    O fatorial de um inteiro não negativo n é o produto de todos os inteiros positivos menores ou iguais a n, denotado como n!.

  2. Como instalo o SciPy?
    Você pode instalar o SciPy usando o pip com o comando pip install scipy.

  3. Por que os resultados são mostrados como números de ponto flutuante?
    Por padrão, a função special.factorial() retorna valores de ponto flutuante, mesmo para entradas inteiras, portanto resultados grandes são impressos em notação científica.

  4. Como posso obter fatoriais inteiros exatos em vez disso?
    Passe exact=True para a função special.factorial(), como mostrado na seção de ponto flutuante acima.

  5. Qual formato de saída o special.factorial() retorna?
    A saída é retornada como números de ponto flutuante por padrão.