Pandas & NumPy Academy · Lektion

Boolesk maskning och fancy indexing

Filtrera arrayer med booleska villkor och välj godtyckliga element med heltalsarrayer som index.

Lektion 4 av 413 steg

Boolesk maskning och fancy indexing är en gratis lektion i Pandas & NumPy Academy på CoddyKit. Detta är lektion 4 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Pandas & NumPy Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Pandas & NumPy Academy innehåller totalt 4 lektioner.

Booleska arrayer som masker

En boolesk mask är en array med värdena True och False. Använd den som index så behåller du endast de element som markerats med True – ditt främsta verktyg för 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]

Sammansatta booleska villkor

Bygg sammansatta filter med & (och), | (eller) och ~ (inte). Omge alltid varje villkor med parenteser, annars kan operatorprioriteten orsaka problem.

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]

Ändra värden med boolesk indexering

Du kan tilldela direkt till ett booleskt urval och ändra endast de matchande elementen på plats. Det är det snabbaste sättet att begränsa avvikande värden eller fylla i saknade värden.

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 maskning på 2D-arrayer

En boolesk mask på en 2D-array returnerar alltid ett platt 1D-resultat. Om du vill välja hela rader skapar du en 1D-mask från en kolumn och indexerar längs 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) behåller arrayens form: den väljer x där villkoret gäller och y på övriga platser. Perfekt för att byta ut värden utan att platta ut arrayen.

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

Grunderna i avancerad indexering

Avancerad indexering innebär att du skickar in en array med heltalsindex för att hämta specifika element – i valfri ordning och även med upprepningar. Den returnerar alltid en kopia.

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

Avancerad indexering på 2D-arrayer

I en 2D-array väljer parade indexarrayer spridda punkter: m[rows, cols] hämtar elementet vid varje par av typen (rad, kolumn), inte en hel delmatris.

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_ för urval i ett rad-kolumn-rutnät

np.ix_ väljer en delmatris för varje kombination av de rader och kolumner du anger – praktiskt när du vill ha många rader OCH många kolumner, inte bara 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() och np.argwhere()

np.nonzero returnerar indexen för element som inte är noll (eller är True) som en tupel per axel. np.argwhere ger samma information staplad som lättlästa rader.

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

Kombinera boolesk och avancerad indexering

Kombinera de två: använd en boolesk mask för att filtrera rader och sedan avancerad indexering för att ändra ordningen på kolumnerna. Tillsammans filtrerar och omorganiserar de data i ett tydligt steg.

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)

Prestanda: boolesk kontra avancerad indexering

Både boolesk och avancerad indexering returnerar kopior. För filtrering är en boolesk mask oftast mest lättläst och tillräckligt snabb – ett utmärkt standardval.

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))

Snabbtest

Testa dina kunskaper om boolesk maskning och avancerad indexering från den här lektionen.

Lektionssammanfattning

Bra gjort! Booleska masker filtrerar och kopierar, np.where behåller arrayens form och avancerad indexering hämtar vilka element du än anger. Nästa del: Pandas Series!

Gratis att börja

Lär dig Python med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
30
Lektioner
120

Vanliga frågor

Är lektionen ”Boolesk maskning och fancy indexing” gratis?

Ja – hela texten till ”Boolesk maskning och fancy indexing” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Pandas & NumPy Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Pandas & NumPy Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Boolesk maskning och fancy indexing”?

Filtrera arrayer med booleska villkor och välj godtyckliga element med heltalsarrayer som index. Ni övar på Pandas & NumPy Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Pandas & NumPy Academy?

Du behöver inga förkunskaper. Utbildningen i Pandas & NumPy Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”Boolesk maskning och fancy indexing”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Pandas & NumPy Academy-lektionen?

Ja. Varje Pandas & NumPy Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Universella funktioner (ufuncs)
  2. Aggregeringsfunktioner
  3. Regler för broadcasting
  4. Boolesk maskning och fancy indexing
← Tillbaka till Pandas & NumPy Academy