Guía para la resta de matrices NumPy

En esta guía, aprenda cómo realizar la resta de matriz NumPy de matrices de la misma forma y de diferentes formas, con transmisión, en Python.

Introducción

Restar dos matrices en NumPy es una tarea bastante común de realizar. La forma más directa de restar dos matrices en NumPy es usando el operador -, que es la simplificación del método np.subtract(): método específico de NumPy diseñado para restar matrices y otros objetos similares a matrices, como matrices .

{.icon aria-hidden=“true”}

Nota: El objeto similar a una matriz en NumPy se considera que es cualquier objeto que se puede pasar al método np.array() para que cree un objeto que tenga el tipo ndarray.

En esta guía, descubrirá cómo restar dos matrices en NumPy usando tanto el operador - como el método np.subtract(), cuándo usar cualquiera de ellos y tendrá una comprensión más profunda de todos los matices de el método np.subtract() en NumPy.

Cómo restar dos matrices en NumPy

En álgebra, dos matrices se pueden restar solo si ambas tienen el mismo número de filas y columnas, lo que significa que tienen la misma forma. Supongamos que tiene dos matrices de la misma forma que desea restar:

1
2
matrix1 = np.array([[2, 4, 0], [9, 1, 7]])
matrix2 = np.array([[2, 2, 1], [3, 5, 8]])

{.icon aria-hidden=“true”}

Nota: Antes de llamar a cualquiera de los métodos de NumPy, como el método np.array() por primera vez, debe importar el módulo NumPy en su proyecto con importar numpy como np

Como puede ver, dos matrices tienen la misma forma, lo que significa que matriz1.forma es igual a matriz2.forma - ambas son iguales a (2, 3). Este hecho es crucial porque tanto el operador - como el método np.subtract() no se comportarán como se espera de lo contrario.

{.icon aria-hidden=“true”}

Nota: La propiedad shape de cualquier objeto ndarray (una matriz o matriz) almacena la forma de ese objeto en forma de (m, n), donde m representa el número de filas y n representa el número de columnas en una matriz.

Ahora puedes restar esas dos matrices usando el operador -:

1
resultMatrix = matrix1 - matrix2

¡Tan simple como eso! Esta línea es igual a la siguiente línea:

1
resultMatrix = np.subtract(matrix1, matrix2)

En ambos casos, resultMatrix tendrá exactamente el mismo valor, como se esperaba:

1
2
[ 0  2 -1]
[ 6 -4 -1]

Restando dos matrices de diferentes formas en NumPy {#restando dos matrices de diferentes formas en numpy}

La sección anterior ilustró la forma más intuitiva de usar la resta en NumPy. Las reglas del álgebra establecen que puedes restar dos matrices solo si tienen la misma forma, por lo que la sección anterior describe el único tipo de resta de matrices que es matemáticamente válido.

Sin embargo, la biblioteca NumPy permite que el método np.subtract() funcione incluso si las matrices de argumentos no tienen la misma forma. Lo hace con la ayuda de un mecanismo llamado broadcasting, que define cómo NumPy trata las matrices de diferentes formas durante las operaciones aritméticas. En última instancia, se igualan en forma y se realiza la resta habitual.

Por ejemplo, echemos un vistazo a las siguientes dos matrices:

1
2
rowMatrix = np.array([1, 2, 3])
columnMatrix = np.array([[1], [2], [3]])

Esas matrices definitivamente tienen diferentes formas, rowMatrix.shape es (1, 3), y columnMatrix.shape es (3, 1). Esto podría confundirte y hacerte pensar que no puedes* restarlos en NumPy, pero eso definitivamente es posible (aunque indirectamente, ya que se transmiten automáticamente antes de la resta):

1
resultMatrix = np.subtract(rowMatrix, columnMatrix)

{.icon aria-hidden=“true”}

Nota: resultMatrix tendrá exactamente el mismo valor si usa el operador - en lugar del método np.subtract()

La resultMatrix tendrá el siguiente valor:

1
2
3
[ 0  1  2]
[-1  0  1]
[-2 -1  0]

Sin embargo, este resultado puede parecer un poco contradictorio, pero usémoslo para ilustrar el mecanismo de transmisión en términos simples.

¿Qué es NumPy Broadcasting?

Para restar columnMatrix de rowMatrix ambos deben tener la misma forma. Dado que esas dos matrices no cumplen con el criterio mencionado, se establece el mecanismo de transmisión. Se asegura de estirar ambos para tener formas compatibles. Por lo tanto, rowMatrix se estira para que forme la matriz de la forma (3, 3):

1
2
3
4
5
6
7
> Original `resultMatrix`:
[1 2 3]

> Broadcasted `resultMatrix`:
[1 2 3]
[1 2 3]
[1 2 3]

De manera similar, columnMatrix se estira para formar también la matriz (3, 3):

1
2
3
4
5
6
7
8
9
> Original `resultMatrix`:
[1]
[2]
[3]

> Broadcasted `resultMatrix`:
[1 1 1]
[2 2 2]
[3 3 3]

Ahora que tiene dos matrices modificadas de la misma forma, se puede realizar la resta en ellas. La matriz resultante es la misma que la resultMatrix del ejemplo anterior.

1
2
3
[1 2 3]   [1 1 1]   [ 0  1  2]
[1 2 3] - [2 2 2] = [-1  0  1]
[1 2 3]   [3 3 3]   [-2 -1  0]

{.icon aria-hidden=“true”}

Alerta: La transmisión es un mecanismo mucho más complejo que el que se describe aquí, por lo que le recomendamos encarecidamente que lo utilice con precaución o realice más investigaciones sobre el tema. Por ejemplo, alguna otra combinación de dos formas de matriz producirá un ValueError porque esas formas no se pueden transmitir en la misma forma.

Cuándo usar el método np.subtract() en lugar del operador -

Basado en lo que has visto hasta ahora, puedes concluir que puedes usar - y subtract() indistintamente en cualquier momento que quieras. Eso es casi cierto, pero hay algunos casos en los que debería considerar usar el método np.subtract() en lugar del operador -.

En esencia, el operador - es una abstracción del método np.subtract(). Cuando se le llama, el operador - llamará efectivamente a np.subtract() con sus parámetros predeterminados. Por lo tanto, el único caso de uso en el que puede considerar usar np.subtract() sobre el operador - es cuando desea modificar el comportamiento predeterminado predefinido de la resta en NumPy. Echaremos un vistazo a algunos argumentos con los que puede ser interesante jugar.

En primer lugar, echemos un vistazo a la declaración del método np.subtract():

1
numpy.subtract(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature, extobj]) = <ufunc 'subtract'>

Además de algunos argumentos habituales y que se explican por sí mismos, la sección de la declaración que probablemente llamará su atención es <ufunc 'subtract'>, así que primero aclaremos qué significa. En NumPy, ufunc significa función universal, por lo que este argumento indica que el método np.subtract() es una función universal.

Las funciones universales en NumPy operan en arreglos (más específicamente ndarrays) de forma elemento por elemento. Pueden iterar eficientemente sobre elementos de dos ndarrays y realizar una operación predefinida en los elementos correspondientes. Por ejemplo, np.subtract() restará dos elementos correspondientes de dos ndarrays. Por lo tanto, puede pensar en las funciones universales como funciones básicas predefinidas, que le permiten realizar una amplia variedad de operaciones matemáticas básicas en ndarrays.

Ahora podemos describir algunos otros argumentos interesantes:

  • x1 (obligatorio)
    • the first input array (or other array-like objects)
    • has to be either the same shape as x2 or broadcastable to the same shape as x2
  • x2 (obligatorio)
    • the second input array (or other array-like objects)
    • has to be either the same shape as x1 or broadcastable to the same shape as x1
  • fuera (opcional)
    • used if you want to specify the location where to store the result
    • if not specified, the new object is created to store the result
    • if specified, it has to be a ndarray object or a tuple of ndarray and None objects
    • the specified object has to have the shape that the two input arrays broadcast to
  • donde (opcional)
    • used if you want to specify some elements of the input array on which the ufunc will not be performed
    • the default value is True, thus the np.subtract() will subtract all corresponding elements from x1 and x2
    • if you want not to subtract elements on a certain position in the out array, you can pass the array of Boolean values which has the same shape as the out array, and set the value to False on those positions
  • dtipo (opcional)
    • used to specify the type of the result matrix
    • by default, it is equal to the type of the input arrays

Conclusión

Ya sea que esté buscando una manera fácil de restar dos matrices usando NumPy o tratando de recordar conceptos más avanzados relacionados con el método np.subtract(), esta guía lo tiene cubierto. El punto principal de esta guía fue darle la respuesta a ambas preguntas.

En primer lugar, hemos cubierto la forma fácil e intuitiva de restar dos matrices en el módulo NumPy. Además de eso, hemos discutido las similitudes y diferencias entre el operador - y el método np.subtract(). Luego, hemos ilustrado el concepto de transmisión en NumPy, pero le recomendamos que profundice más en el tema de la transmisión.

Al final, le brindamos una descripción detallada del método np.subtract() en NumPy, por lo que puede modificar su comportamiento predeterminado para que sea más adecuado para ciertos casos de uso más específicos. icos.

Licensed under CC BY-NC-SA 4.0