Pandas & NumPy Academy · Lektion

Boolesk maskering og fancy indexing

Filtrér arrays med booleske betingelser, og vælg vilkårlige elementer ved hjælp af heltalsarrays med indekser.

Lektion 4 af 413 trin

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!

Gratis at komme i gang

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

  1. Universelle funktioner (ufuncs)
  2. Aggregationsfunktioner
  3. Broadcasting-regler
  4. Boolesk maskering og fancy indexing
← Tilbage til Pandas & NumPy Academy