En Python, podemos usar la función numpy.where() para seleccionar elementos de una matriz numpy, según una condición.
No sólo eso, sino que podemos realizar algunas operaciones en esos elementos si se cumple la condición.
¡Veamos cómo podemos utilizar esta función, usando algunos ejemplos ilustrativos!
Sintaxis de Python numpy.where()
Esta función acepta una matriz similar a numpy (por ejemplo, una matriz NumPy de números enteros/booleanos).
Devuelve una nueva matriz numpy, después de filtrar según una condición , que es una matriz similar a numpy de valores booleanos.
Por ejemplo, conditionpuede tomar el valor de ), que es una matriz booleana similar a NumPy. (De manera predeterminada, NumPy solo admite valores numéricos, pero también array([[True, True, True]]podemos convertirlos a )bool
Por ejemplo, si conditiones array([[True, True, False]]), y nuestra matriz es a = ndarray([[1, 2, 3]]), al aplicar una condición a array( a[:, condition]), obtendremos la matriz ndarray([[1 2]]).
import numpy as npa = np.arange(10)print(a[a = 2]) # Will only capture elements = 2 and ignore others
Outputarray([0 1 2])
NOTA : La misma condición también se puede representar como = 2. Este es el formato recomendado para la matriz de condiciones, ya que es muy tedioso escribirla como una matriz booleana.
Pero ¿qué pasa si queremos conservar la dimensión del resultado y no perder elementos de nuestra matriz original? Podemos usar numpy.where() para esto.
numpy.where(condition [, x, y])
Tenemos dos parámetros más xy y¿Cuáles son?
Básicamente, lo que esto dice es que si conditiones verdadero para algún elemento en nuestra matriz, la nueva matriz elegirá elementos de x.
De lo contrario, si es falso, yse tomarán elementos de.
Con esto, nuestra matriz de salida final será una matriz con elementos de xcualquier lugar condition = Truey elementos de ycualquier momento condition = False.
Tenga en cuenta que, aunque xy yson opcionales, si especifica x, DEBE especificar también y. Esto se debe a que, en este caso , la forma de la matriz de salida debe ser la misma que la de la matriz de entrada.
NOTA : La misma lógica se aplica tanto a matrices unidimensionales como multidimensionales. En ambos casos, filtramos en función de la condición. Recuerde también que las formas de xy yse conditiontransmiten juntas.
Ahora veamos algunos ejemplos para entender correctamente esta función.
Usando numpy.where() de Python
Supongamos que queremos tomar solo elementos positivos de una matriz numpy y establecer todos los elementos negativos en 0, escribamos el código usando numpy.where().
1. Reemplazar elementos con numpy.where()
Aquí utilizaremos una matriz aleatoria bidimensional y solo generaremos los elementos positivos.
import numpy as np# Random initialization of a (2D array)a = np.random.randn(2, 3)print(a)# b will be all elements of a whenever the condition holds true (i.e only positive elements)# Otherwise, set it as 0b = np.where(a 0, a, 0)print(b)
Output[[-1.06455975 0.94589166 -1.94987123] [-1.72083344 -0.69813711 1.05448464]][[0. 0.94589166 0. ] [0. 0. 1.05448464]]
¡Como podéis observar, ahora sólo se conservan los elementos positivos!
2. Uso de numpy.where() con solo una condición
Puede haber cierta confusión con respecto al código anterior, ya que algunos de ustedes pueden pensar que la forma más intuitiva sería simplemente escribir la condición de esta manera:
import randomimport numpy as npa = np.random.randn(2, 3)b = np.where(a 0)print(b)
Si ahora intenta ejecutar el código anterior, con este cambio, obtendrá un resultado como este:
(array([0, 1]), array([2, 1]))
Si observas con atención, bahora hay una tupla de matrices numpy. Y cada matriz es la ubicación de un elemento positivo. ¿Qué significa esto?
Siempre que proporcionamos sólo una condición, esta función es en realidad equivalente a np.asarray.nonzero().
En nuestro ejemplo, np.asarray(a 0)devolverá una matriz de tipo booleano después de aplicar la condición y np.nonzero(arr_like)devolverá los índices de los elementos distintos de cero de arr_like. (Consulte este enlace)
Ahora veremos un ejemplo más simple que nos muestra cuán flexibles podemos ser con numpy.
import numpy as npa = np.arange(10)b = np.where(a 5, a, a * 10)print(a)print(b)
Salida
[0 1 2 3 4 5 6 7 8 9][ 0 1 2 3 4 50 60 70 80 90]
Aquí, la condición es a 5, que será la matriz tipo numpy [True True True True True False False False False False], xes la matriz a, y yes la matriz a * 10. Entonces, elegimos de an solo si a 5, y de a * 10, si a 5.
Entonces, esto transforma todos los elementos = 5, mediante la multiplicación por 10. ¡Esto es lo que obtenemos realmente!
Transmitiendo con numpy.where()
Si proporcionamos todas conditionlas matrices , xy y, numpy las transmitirá juntas.
import numpy as npa = np.arange(12).reshape(3, 4)b = np.arange(4).reshape(1, 4)print(a)print(b)# Broadcasts (a 5, a, and b * 10)# of shape (3, 4), (3, 4) and (1, 4)c = np.where(a 5, a, b * 10)print(c)
Output[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]][[0 1 2 3]][[ 0 1 2 3] [ 4 10 20 30] [ 0 10 20 30]]
Nuevamente, aquí, la salida se selecciona en función de la condición, por lo que todos los elementos, pero aquí, bse transmite a la forma de a. (Una de sus dimensiones tiene solo un elemento, por lo que no habrá errores durante la transmisión)
Entonces, bahora se convertirá en [[0 1 2 3] [0 1 2 3] [0 1 2 3]], y ahora, podemos seleccionar elementos incluso de esta matriz transmitida.
Por lo tanto, la forma de la salida es la misma que la forma de a.
Conclusión
En este artículo, aprendimos cómo podemos usar la función numpy.where() de Python para seleccionar matrices en función de otra matriz de condiciones.
Referencias
- Documentación de SciPy sobre la función numpy.where() de Python