HOWTO · NumPy

Factorial de NumPy

Aprenda a calcular el factorial de los elementos de una matriz NumPy utilizando la función special.factorial() de SciPy en Python, con ejemplos de código y explicaciones de los resultados, incluido por qué los valores se devuelven como números de punto flotante y cómo solicitar resultados enteros exactos en su lugar.

En esta página

Calcular el factorial de números es una tarea común en matemáticas y programación, especialmente en campos como la estadística y la combinatoria. En Python, podemos calcular el factorial de los elementos de una matriz NumPy utilizando la función special.factorial() de la biblioteca SciPy.

Esta función realiza el cálculo elemento por elemento sobre una matriz. Ya sea que trabaje con un pequeño conjunto de números o con una matriz grande, la misma llamada aplica el factorial a cada elemento a la vez.

En este artículo, exploraremos cómo utilizar la función special.factorial(), proporcionando ejemplos claros y explicaciones para ayudarle a comprender este concepto esencial.

¿Qué es un factorial?

Antes de sumergirnos en el código, es crucial entender qué es un factorial. El factorial de un entero no negativo n, denotado como n!, es el producto de todos los enteros positivos menores o iguales a n. Por ejemplo, 5! es igual a 5 × 4 × 3 × 2 × 1, que es igual a 120. Los factoriales se utilizan ampliamente en permutaciones, combinaciones y otros cálculos matemáticos.

En programación, a menudo se necesitan factoriales para cada elemento de una matriz a la vez. Aquí es donde NumPy y SciPy entran en juego: special.factorial() aplica la operación elemento por elemento sobre una matriz.

Usar la función special.factorial() de SciPy

La función special.factorial() de la biblioteca SciPy está diseñada para calcular el factorial de cada elemento de una matriz. Realiza la operación elemento por elemento, por lo que una sola llamada maneja una matriz de cualquier tamaño.

Para usar esta función, primero necesita instalar la biblioteca SciPy si aún no lo ha hecho. Puede hacerlo utilizando pip:

pip install scipy

Una vez que haya instalado SciPy, puede comenzar a usar la función special.factorial(). A continuación, se muestra un ejemplo sencillo para demostrar cómo calcular el factorial de una matriz de enteros.

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.]

En este ejemplo, primero importamos las bibliotecas necesarias: NumPy y el módulo special de SciPy. Creamos una matriz NumPy que contiene enteros del 0 al 5. Al pasar esta matriz a la función special.factorial(), obtenemos los factoriales de estos números. La salida muestra los factoriales respectivos como números de punto flotante, que es el comportamiento predeterminado de la función.

Calcular factoriales para matrices grandes

La misma llamada funciona sin cambios para matrices más grandes.

Veamos un ejemplo en el que calculamos el factorial para un rango más grande 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]

En este caso, creamos una matriz que contiene enteros del 10 al 20 utilizando np.arange(). La función special.factorial() calcula el factorial de cada elemento de esta matriz, sin necesidad de escribir un bucle. La salida se muestra en notación científica debido al gran tamaño de los números.

Por qué los resultados son números de punto flotante

Observe de nuevo las salidas anteriores: los factoriales vuelven como números de punto flotante — 120. en lugar de 120, y los resultados más grandes en notación científica. Ese es el comportamiento predeterminado de special.factorial(): devuelve sus resultados como valores de punto flotante, incluso cuando cada entrada es un entero.

Los números de punto flotante tienen precisión limitada, por lo que para factoriales muy grandes el valor devuelto es el número de punto flotante representable más cercano y no el entero exacto. Si necesita resultados enteros exactos, pase 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]

Con exact=True, las mismas entradas devuelven enteros sin punto decimal, como muestra la salida. Elija la forma predeterminada cuando los resultados de punto flotante sean aceptables para su cálculo, y la forma exacta cuando importe el valor entero preciso.

Conclusión

En resumen, la función special.factorial() de la biblioteca SciPy calcula factoriales elemento por elemento sobre una matriz NumPy en Python. Ya sea que trabaje con una matriz pequeña o grande, se aplica la misma llamada, y los resultados vuelven como números de punto flotante de forma predeterminada, con resultados enteros exactos disponibles pasando exact=True. Comprender cómo calcular factoriales no solo ayuda en los cálculos matemáticos, sino que también abre puertas a temas más avanzados en estadística y ciencia de datos.

FAQ

  1. ¿Qué es el factorial de un número?
    El factorial de un entero no negativo n es el producto de todos los enteros positivos menores o iguales a n, denotado como n!.

  2. ¿Cómo instalo SciPy?
    Puede instalar SciPy utilizando pip con el comando pip install scipy.

  3. ¿Por qué los resultados se muestran como números de punto flotante?
    De forma predeterminada, la función special.factorial() devuelve valores de punto flotante, incluso para entradas enteras, por lo que los resultados grandes se imprimen en notación científica.

  4. ¿Cómo puedo obtener factoriales enteros exactos en su lugar?
    Pase exact=True a la función special.factorial(), como se muestra en la sección de punto flotante anterior.

  5. ¿Qué formato de salida devuelve special.factorial()?
    La salida se devuelve como números de punto flotante de forma predeterminada.