Hoe de Python numpy.where() methode te gebruiken

In Python kunnen we de functie numpy.where() gebruiken om elementen uit een numpy-array te selecteren op basis van een voorwaarde.

Niet alleen dat, maar we kunnen ook enkele bewerkingen uitvoeren op die elementen als aan de voorwaarde is voldaan.

Laten we eens kijken hoe we deze functie kunnen gebruiken aan de hand van een paar illustratieve voorbeelden!


Syntax van Python numpy.where()

Deze functie accepteert een numpy-achtige array (bijv. een NumPy-array van integers/booleans).

Het retourneert een nieuwe numpy-array, na filtering op basis van een voorwaarde, die een numpy-achtige array van boolean-waarden is.

Bijvoorbeeld, condition kan de waarde array([[True, True, True]]) aannemen, wat een numpy-achtige boolean-array is. (Standaard ondersteunt NumPy alleen numerieke waarden, maar we kunnen ze ook naar bool casten)

Bijvoorbeeld, als condition array([[True, True, False]]) is, en onze array a = ndarray([[1, 2, 3]]) is, door een voorwaarde toe te passen op de array (a[:, condition]), krijgen we de array ndarray([[1 2]]).

import numpy as np

a = np.arange(10)
print(a[a <= 2]) # Zal alleen elementen <= 2 vastleggen en anderen negeren

Uitvoer

array([0 1 2])

OPMERKING: Dezelfde voorwaarde kan ook worden gerepresenteerd als a <= 2. Dit is het aanbevolen formaat voor de voorwaarde array, aangezien het erg tijdrovend is om het als een booleaanse array te schrijven

Maar wat als we de dimensie van het resultaat willen behouden, en geen elementen willen verliezen uit onze oorspronkelijke array? Hiervoor kunnen we numpy.where() gebruiken.

numpy.where(condition [, x, y])

We hebben nog twee parameters x en y. Wat zijn die?

In feite zegt dit dat als voorwaarde waar is voor een bepaald element in onze array, het nieuwe array elementen zal kiezen uit x.

Anders, als het onwaar is, worden elementen uit y genomen.

Met dat, zal ons uiteindelijke output array een array zijn met elementen uit x waar voorwaarde = Waar, en elementen uit y wanneer voorwaarde = Onwaar.

Merk op dat hoewel x en y optioneel zijn, als je x specificeert, je MOET ook y specificeren. Dit komt omdat, in dit geval, de vorm van het output array gelijk moet zijn aan het input array.

OPMERKING: Dezelfde logica geldt ook voor zowel enkele als meerdere dimensionale arrays. In beide gevallen filteren we op basis van de voorwaarde. Onthoud ook dat de vormen van x, y en voorwaarde samen worden uitgezonden.

Nu, laten we eens kijken naar enkele voorbeelden om deze functie goed te begrijpen.


Gebruik van Python numpy.where()

Stel dat we alleen positieve elementen uit een numpy-array willen halen en alle negatieve elementen op 0 willen zetten, laten we de code schrijven met behulp van numpy.where().

1. Vervang elementen met numpy.where()

We zullen hier een 2-dimensionale willekeurige array gebruiken en alleen de positieve elementen uitvoeren.

import numpy as np

# Willekeurige initialisatie van een (2D-array)
a = np.random.randn(2, 3)
print(a)

# b zal alle elementen van a zijn wanneer de voorwaarde waar is (d.w.z. alleen positieve elementen)
# Anders, stel het in als 0
b = np.where(a > 0, a, 0)

print(b)

Mogelijke uitvoer

[[-1.06455975  0.94589166 -1.94987123]
 [-1.72083344 -0.69813711  1.05448464]]
[[0.         0.94589166 0.        ]
 [0.         0.         1.05448464]]

Zoals je kunt zien, zijn alleen de positieve elementen nu behouden gebleven!

2. Gebruik van numpy.where() met slechts één voorwaarde

Er kan enige verwarring zijn over de bovenstaande code, aangezien sommigen van jullie misschien denken dat de meer intuïtieve manier zou zijn om de voorwaarde eenvoudigweg zo te schrijven:

import random
import numpy as np

a = np.random.randn(2, 3)
b = np.where(a > 0)
print(b)

Als je nu probeert de bovenstaande code uit te voeren, met deze wijziging, krijg je een uitvoer zoals deze:

(array([0, 1]), array([2, 1]))

Als je goed kijkt, is b nu een tuple van numpy-arrays. En elk array is de locatie van een positief element. Wat betekent dit?

Telkens wanneer we alleen een voorwaarde opgeven, is deze functie eigenlijk equivalent aan np.asarray.nonzero().

In ons voorbeeld zal np.asarray(a > 0) een boolean-achtig array retourneren na toepassing van de voorwaarde, en np.nonzero(arr_like) zal de indices van de niet-nul elementen van arr_like retourneren. (Zie deze link)

We zullen dus nu kijken naar een eenvoudiger voorbeeld, dat ons laat zien hoe flexibel we kunnen zijn met numpy!

import numpy as np

a = np.arange(10)

b = np.where(a < 5, a, a * 10)

print(a)
print(b)

Uitvoer

[0 1 2 3 4 5 6 7 8 9]
[ 0  1  2  3  4 50 60 70 80 90]

Hier is de voorwaarde a < 5, die de numpy-achtige array [True True True True True False False False False False] zal zijn, x is de array a, en y is de array a * 10. Dus, we kiezen uit a alleen als a < 5, en uit a * 10, als a > 5.

Dus, dit transformeert alle elementen >= 5, door vermenigvuldiging met 10. Dit is inderdaad wat we krijgen!


Uitzenden met numpy.where()

Als we allemaal conditie, x, en y arrays verstrekken, zal numpy ze samen uitzenden.

import numpy as np

a = np.arange(12).reshape(3, 4)

b = np.arange(4).reshape(1, 4)

print(a)
print(b)

# Uitzendingen (a < 5, a, en b * 10)
# van vorm (3, 4), (3, 4) en (1, 4)
c = np.where(a < 5, a, b * 10)

print(c)

Resultaat

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

Hier wordt opnieuw de uitvoer geselecteerd op basis van de voorwaarde, dus alle elementen, maar hier wordt b uitgezonden naar de vorm van a. (Een van de dimensies heeft slechts één element, dus er zullen geen fouten optreden tijdens het uitzenden)

Dus, b zal nu worden [[0 1 2 3] [0 1 2 3] [0 1 2 3]], en nu kunnen we zelfs elementen selecteren uit deze uitgezonden array.

Dus de vorm van de uitvoer is hetzelfde als de vorm van a.


Conclusie

In dit artikel hebben we geleerd hoe we de Python numpy.where() functie kunnen gebruiken om arrays te selecteren op basis van een andere voorwaarde array.


Referenties


Source:
https://www.digitalocean.com/community/tutorials/python-numpy-where