Boolesk maskering og fancy indexing
Filtrér arrays med booleske betingelser, og vælg vilkårlige elementer ved hjælp af heltalsarrays med indekser.
Boolesk maskering og fancy indexing er en gratis Pandas & NumPy Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Pandas & NumPy Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Pandas & NumPy Academy-kurset indeholder 4 lektioner i alt.
Booleske arrays som masker
En boolesk maske er et array med True/False-værdier. Brug den som indeks, så beholder du kun de elementer, der er markeret med True — dit vigtigste værktøj til filtrering.
import numpy as np
a = np.array([5, 3, 8, 1, 9, 2, 7])
mask = a > 4
print(mask) # [ True False True False True False True]
print(a[mask]) # [5 8 9 7]Sammensatte booleske betingelser
Byg sammensatte filtre med & (og), | (eller) og ~ (ikke). Sæt altid hver betingelse i parenteser, ellers kan operatorernes prioritet give problemer.
import numpy as np
a = np.array([3, 7, 2, 9, 1, 6, 4, 8])
# Elements between 4 and 8 inclusive
result = a[(a >= 4) & (a <= 8)]
print(result) # [7 6 4 8]
# Elements less than 3 or greater than 7
result2 = a[(a < 3) | (a > 7)]
print(result2) # [2 9 1 8]Ændring af værdier med boolesk indeksering
Du kan tildele direkte til et boolesk udvalg og dermed kun ændre de matchende elementer på stedet. Det er den hurtigste måde at begrænse afvigende værdier eller udfylde manglende værdier på.
import numpy as np
a = np.array([5, -3, 8, -1, 2, -7])
a[a < 0] = 0 # zero out negatives in-place
print(a) # [5 0 8 0 2 0]
# Cap values above 6
a[a > 6] = 6
print(a) # [5 0 6 0 2 0]Boolesk maskering på 2D-arrays
En boolesk maske på et 2D-array returnerer altid et fladt 1D-resultat. Hvis du vil vælge hele rækker, skal du oprette en 1D-maske ud fra én kolonne og indeksere langs axis 0.
import numpy as np
m = np.array([[1, 5], [3, 2], [8, 4], [6, 7]])
# Select rows where first column > 4
mask = m[:, 0] > 4
print(mask) # [False False True True]
print(m[mask]) # [[8 4] [6 7]]np.where med masker
np.where(condition, x, y) bevarer arrayets form: den vælger x, hvor betingelsen er opfyldt, og y alle andre steder. Det er perfekt til at udskifte værdier uden at gøre arrayet fladt.
import numpy as np
a = np.array([3, -1, 5, -2, 4])
result = np.where(a >= 0, a, 0) # keep positives, replace negatives
print(result) # [3 0 5 0 4]
# Recode: above-average -> 'high', else -> 'low'
labels = np.where(a >= a.mean(), 'high', 'low')
print(labels) # ['high' 'low' 'high' 'low' 'high']Grundlæggende fancy-indeksering
Fancy-indeksering betyder, at du giver et array med heltalsindekser for at hente bestemte elementer — i vilkårlig rækkefølge og med gentagelser. Den returnerer altid en kopi.
import numpy as np
a = np.array([10, 20, 30, 40, 50])
idx = np.array([4, 1, 1, 3])
print(a[idx]) # [50 20 20 40]
# 2D index shape -> 2D output
idx2d = np.array([[0, 2], [4, 1]])
print(a[idx2d]) # [[10 30] [50 20]]Fancy-indeksering på 2D-arrays
På et 2D-array vælger par af indeksarrays spredte punkter: m[rows, cols] henter elementet ved hvert (row, col)-par, ikke en hel undermatrice.
import numpy as np
m = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# Select elements at (0,2), (1,0), (2,1)
rows = [0, 1, 2]
cols = [2, 0, 1]
print(m[rows, cols]) # [3 4 8]np.ix_ til valg af gitter af rækker og kolonner
np.ix_ vælger en undermatrice for hver kombination af de rækker og kolonner, du angiver — praktisk, når du vil have mange rækker OG mange kolonner, ikke kun par.
import numpy as np
m = np.arange(16).reshape(4, 4)
print(m)
# Select rows 0,2 and columns 1,3
ix = np.ix_([0, 2], [1, 3])
print(m[ix])
# [[ 1 3]
# [ 9 11]]np.nonzero() og np.argwhere()
np.nonzero returnerer indekserne for elementer, der ikke er nul (eller er True), som en tupel pr. akse. np.argwhere giver de samme oplysninger samlet i letlæselige rækker.
import numpy as np
a = np.array([0, 3, 0, 5, 0, 7])
print(np.nonzero(a)) # (array([1, 3, 5]),)
print(np.argwhere(a > 0)) # [[1] [3] [5]]Kombination af boolesk og fancy-indeksering
Kombinér de to: Brug en boolesk maske til at filtrere rækker, og brug derefter fancy-indeksering til at ændre rækkefølgen af kolonnerne. Sammen filtrerer og omarrangerer de data i ét overskueligt trin.
import numpy as np
data = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
scores = np.array([0.9, 0.3, 0.8])
# Keep high-scoring rows, reorder columns to [2, 0, 1]
high = data[scores > 0.5]
reordered = high[:, [2, 0, 1]]
print(reordered)Ydeevne: Boolesk kontra fancy-indeksering
Både boolesk og fancy-indeksering returnerer kopier. Til filtrering er en boolesk maske normalt lettest at læse og rigeligt hurtig — et godt standardvalg.
import numpy as np
a = np.random.rand(1_000_000)
# Boolean mask -- readable and fast
result = a[a > 0.5]
print('filtered size:', result.size) # ~500000
# Equivalent with np.where + fancy index
idx = np.where(a > 0.5)[0]
result2 = a[idx]
print('same result:', np.array_equal(result, result2))Hurtig kontrol
Test din forståelse af boolesk maskering og fancy-indeksering fra denne lektion.
Opsummering af lektionen
Godt klaret! Booleske masker filtrerer og kopierer, np.where bevarer arrayets form, og fancy-indeksering henter de elementer, du angiver. Næste emne: Pandas Series!
Lær Python med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 30
- Lektioner
- 120
Ofte stillede spørgsmål
Er lektionen “Boolesk maskering og fancy indexing” gratis?
Ja — hele teksten til “Boolesk maskering og fancy indexing” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Pandas & NumPy Academy-kurset, skal du opgradere til CoddyKit PRO. Pandas & NumPy Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Boolesk maskering og fancy indexing”?
Filtrér arrays med booleske betingelser, og vælg vilkårlige elementer ved hjælp af heltalsarrays med indekser. Du øver dig i Pandas & NumPy Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Pandas & NumPy Academy?
Der kræves ingen tidligere erfaring. Pandas & NumPy Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.
Hvor lang tid tager lektionen “Boolesk maskering og fancy indexing”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Pandas & NumPy Academy-lektion?
Ja. Alle Pandas & NumPy Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Universelle funktioner (ufuncs)
- Aggregationsfunktioner
- Broadcasting-regler
- Boolesk maskering og fancy indexing